2015-04-19 1 views
2

Я просто хочу, чтобы зарегистрировать общий обработчик команд с Виндзорский замок, это то, что я сделал в ControllerInstaller:Устранить зависимость Command Handler с Виндзорский замок

container.Register(
    Classes 
     .FromAssemblyContaining<ProductCommand>() 
     .Where(t => t.Name.EndsWith("CommandHandler")) 
     .WithService.AllInterfaces() 
     .LifestylePerWebRequest()); 

и это мой класс ProductCommandHandler:

public class ProductCommandHandler : ICommandHandler<CreateProductCommand> 
{ 
} 

, а также мой ICommandHandle это:

public interface ICommandHandler<in TCommand> where TCommand : ICommand 
{ 
    ICommandResult Execute(TCommand command); 
} 

и это, где я получаю ошибку:

public class DefaultCommandBus : ICommandBus 
{ 
    public ICommandResult Send<TCommand>(TCommand command) 
     where TCommand : ICommand 
    { 
     var handler = DependencyResolver.Current 
      .GetService<ICommandHandler<TCommand>>(); 

     if (!((handler != null) && handler != null)) 
     { 
      throw new CommandHandlerNotFoundException(typeof(TCommand)); 
     } 

     return handler.Execute(command); 
    } 

    public IEnumerable<ValidationResult> Validate<TCommand>(TCommand command) 
     where TCommand : ICommand 
    { 
     var handler = DependencyResolver.Current 
      .GetService<IValidationHandler<TCommand>>(); 
     if (!((handler != null) && handler != null)) 
     { 
      throw new ValidationHandlerNotFoundException(typeof(TCommand)); 
     } 

     return handler.Validate(command); 
    } 
} 

я решить проблему с autofac это линия ниже:

builder.RegisterAssemblyTypes(ThisAssembly) 
    .AsClosedTypesOf(typeof(ICommandHandler<>)).InstancePerRequest(); 

, но я не знаю, как я должен решить через замок Виндзор, помогите мне

+0

Я думаю, что действительно страшно, что у вас есть эти нулевые проверки с исключениями. Вместо этого напишите тест интеграции, который проверяет, имеет ли каждая команда в системе соответствующий обработчик команд. Это позволяет вам уведомлять ваши тесты, а не во время выполнения. Гораздо безопаснее. – Steven

+0

Кстати, что случилось с этим ужасным, если чек? '(! ((handler! = null) && handler! = null))'. Это переработанный сложный способ выполнения 'if (handler == null)'. – Steven

ответ

2

У меня тот же механизм, что и у приложения WCF, где вызовы передаются обработчикам сообщений в зависимости от типа сообщения. Способ я использую его заключается в следующем:

  • создать typed factory для обработчиков сообщений
  • Instantiate команды шины (в вашем случае) с экземпляром завода
  • для каждого сообщения пусть завод разрешить правильный обработчик сообщений
  • вызова метода обработчика сообщений

Это в значительной степени основывается на this post by Krzysztof Koźmic, где он описывает довольно много этой архитектуры. Вы можете увидеть my previous answer, если хотите посмотреть, как это закодировано

 Смежные вопросы

  • Нет связанных вопросов^_^