Я пытаюсь реализовать шаблон Command, CommandHandler и CommandDispatcher с помощью Castle Windsor без ручного запроса контейнеру разрешить CommandHandler на основе типа Command (который обычно считается анти-шаблоном).Замок Виндзор и командный шаблон
Я нашел this старой статьи, но реализация ITypedFactoryComponentSelector
изменилась, поэтому теперь она возвращает Func, а не TypedFactoryComponent
.
В любом случае, я был бы очень признателен, если бы кто-то мог пролить свет на «правильную» реализацию этого шаблона. Текущая настройка (упрощенно):
public interface ICommand {}
public class CreateUserCommand:ICommand
{
public string Name { get;set; }
}
public interface ICommandHandler<in TCommand> where TCommand: ICommand
{
ICommandResult Execute(TCommand command);
}
public class CreateUserCommandHandler : ICommandHandler<CreateUserCommand>
{
public ICommandResult Execute(CreateUserCommand command)
{
// some logic here
return new CommandResult() {Success = true};
}
}
public interface ICommandDispatcher
{
ICommandResult Submit<TCommand>(TCommand command) where TCommand: ICommand;
}
public class CommandDispatcher : ICommandDispatcher
{
// I DO NOT WANT TO DO THIS:
IWindsorContainer _container;
public CommandDispatcher(IWindsorContainer container)
{
_container = container;
}
public ICommandResult Submit<TCommand>(TCommand command) where TCommand : Commands.ICommand
{
// I DO NOT WANT TO DO THIS TOO:
var handler = _container.Resolve<ICommandHandler<TCommand>>();
if (handler == null)
{
throw new Exception("Command handler not found for command " + typeof(TCommand).ToString());
}
return handler.Execute(command);
}
}
В принципе все, что я хочу, чтобы настроить контейнер таким образом, что мой контроллер WebAPI может иметь зависимость от ICommandDispatcher
и просто сделать что-то вроде
var result = this.commandDispatcher.Submit(new CreateUserCommand("John Smith"));
if (result.Success){
return Ok();
}
Спасибо! ;)
Спасибо, я уже нашел эти статьи, но, к сожалению, он все еще не работал. После нескольких часов борьбы с этим мне, наконец, удалось заставить его работать, я опубликую полный ответ ниже. Спасибо за вашу помощь! – timurso