Как зарегистрировать необязательный декоратор или декоратор с необязательными параметрами, используя structmap asp.net mvc?

Я реализовал подход CQRS в своем приложении под сильным влиянием этой фантастической статьи:

Есть ли способ в структуре структуры определить, как public interface ICommand { } public interface ICommandHandler<TCommand> { void Handle(TCommand command); } конструируется так, чтобы он использовал некоторый тип валидатора по умолчанию, когда кто-то делает не существует без необходимости брать зависимость от контейнера в классе или создавать интерфейс public class ValidationCommandHandlerDecorator<TCommand> : ICommandHandler<TCommand> where TCommand : CommandBase { private readonly ICommandHandler<TCommand> _decoratedCommandHandler; private readonly ICommandValidator<TCommand> _commandValidator; public ValidationCommandHandlerDecorator(ICommandHandler<TCommand> decoratedCommandHandler, ICommandValidator<TCommand> commandValidator) { _decoratedCommandHandler = decoratedCommandHandler; _commandValidator = commandValidator; } public void Handle(TCommand command) { if (_commandValidator != null) { var validationResult = _commandValidator.Validate(command); if (validationResult != null) { command.Success = false; command.Errors = validationResult; return; } } _decoratedCommandHandler.Handle(command); command.Success = true; } } для обработки команд с валидаторами?

Спасибо.

4 голоса | спросил ryanulit 4 PM00000070000001431 2015, 19:39:14

1 ответ


0

В случае, если кто-нибудь столкнется с этим позже, я решил добавить класс DefaultCommandValidator в качестве класса шаблона Null Object:

public class DefaultCommandValidator<TCommand> : ICommandValidator<TCommand> where TCommand : CommandBase
{
    public IEnumerable<string> Validate(TCommand command)
    {
        return Enumerable.Empty<string>();
    }
}

А затем добавьте эту строку в реестр карт структуры:

For(typeof(ICommandValidator<>)).Use(typeof(DefaultCommandValidator<>));

Я не знал, что этот синтаксис структурной карты будет на самом деле использовать экземпляр ТОЛЬКО по умолчанию, если он не может найти конкретную реализацию ICommandValidator<TCommand>. Теперь, если у меня нет валидатора, я просто не добавляю его, а экземпляр DefaultCommandValidator<TCommand> используется для возврата пустого /успешная проверка.

ответил ryanulit 10 PM00000060000003931 2015, 18:09:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132