我正在使用命令装饰器模式实现一个MVC应用程序,并将Unity。
Problem:我现在关心的是我有一些控制器,它们被注入了多个命令处理程序接口类型。到目前为止,我发现的样本是尼尼特和Autofac。
目标:我希望实现一个命令调度器,它将根据命令明智地决定要解析哪个命令处理程序,这样我就不必管理控制器的构造函数了。
我有命令处理程序接口。
public interface ICommandHandlerAsync<TCommand>
{
Task Handle(TCommand command);
}我的控制器有以下构造函数
public MemberRegistrationController(
Func<ICommandHandlerAsync<RegisterMemberCommand>> registerMemberCommandHanderFactory,
Func<ICommandHandlerAsync<UnregisterMemberCommand>> unregisterMemberCommandHanderFactory)
{
...
}
public async void Register(RegisterMemberViewModel vm)
{
// Map to command using extension
var cmd = vm.MapToCommand();
// Run command
await registerMemberCommandHanderFactory().Handle(cmd);
}
public async void Unregister(UnregisterMemberViewModel vm)
{
// Map to command using extension
var cmd = vm.MapToCommand();
// Run command
await unregisterMemberCommandHanderFactory().Handle(cmd);
}我想要的是像public MemberRegistrationController( Func commandDispatcherFactory {.})之类的东西。
public async void Register(RegisterMemberViewModel vm)
{
// Map to command using extension
var cmd = vm.MapToCommand();
// Run command
await commandDispatcherFactory().Dispatch(cmd);
}
public async void Unregister(UnregisterMemberViewModel vm)
{
// Map to command using extension
var cmd = vm.MapToCommand();
// Run command
await commandDispatcherFactory().Dispatch(cmd);
}谢谢
发布于 2015-10-31 12:13:37
您可以创建一个命令处理程序工厂,它使用统一来获得一个新的ICommandHandlerAsync<TCommand>实例( 默认寿命 )
public interface ICommandHandlerFactory
{
ICommandHandlerAsync<TCommand> GetHandlerFor<TCommand>(TCommand command);
}
public class CommandHandlerFactory: ICommandHandlerFactory
{
private IUnityContainer container;
public CommandHandlerFactory(IUnityContainer container)
{
this.container = container;
}
public ICommandHandlerAsync<TCommand> GetHandlerFor<TCommand>(TCommand command)
{
return this.container.Resolve<ICommandHandlerAsync<TCommand>>();
}
}然后,您可以在Unity中注册工厂和命令处理程序:
var container = new UnityContainer()
.RegisterType<ICommandHandlerAsync<RegisterMemberCommand>, RegisterMemberCommandHandler>()
.RegisterType<ICommandHandlerAsync<UnregisterMemberCommand>, UnregisterMemberCommandHandler>()
.RegisterType<ICommandHandlerFactory, CommandHandlerFactory>();控制器将在其构造函数中接收工厂。操作方法将使用工厂分派命令:
public MemberRegistrationController(ICommandHandlerFactory commandHandlerFactory)
{
this.commandHandlerFactory = commandHandlerFactory;
}
public async void Register(RegisterMemberViewModel vm)
{
// Map to command using extension
var cmd = vm.MapToCommand();
// Run command
await commandHandlerFactory.GetHandlerFor(cmd).Handle(cmd);
}
public async void Unregister(UnregisterMemberViewModel vm)
{
// Map to command using extension
var cmd = vm.MapToCommand();
// Run command
await commandHandlerFactory.GetHandlerFor(cmd).Handle(cmd);
}我已经在这把小提琴中设置了一个演示。
https://stackoverflow.com/questions/33449075
复制相似问题