首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用统一的命令调度器

使用统一的命令调度器
EN

Stack Overflow用户
提问于 2015-10-31 07:14:10
回答 1查看 452关注 0票数 2

我正在使用命令装饰器模式实现一个MVC应用程序,并将Unity。

Problem:我现在关心的是我有一些控制器,它们被注入了多个命令处理程序接口类型。到目前为止,我发现的样本是尼尼特和Autofac。

目标:我希望实现一个命令调度器,它将根据命令明智地决定要解析哪个命令处理程序,这样我就不必管理控制器的构造函数了。

我有命令处理程序接口。

代码语言:javascript
复制
public interface ICommandHandlerAsync<TCommand> 
{
    Task Handle(TCommand command);
}

我的控制器有以下构造函数

代码语言:javascript
复制
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 {.})之类的东西。

代码语言:javascript
复制
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);
}

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-31 12:13:37

您可以创建一个命令处理程序工厂,它使用统一来获得一个新的ICommandHandlerAsync<TCommand>实例( 默认寿命 )

代码语言:javascript
复制
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中注册工厂和命令处理程序:

代码语言:javascript
复制
var container = new UnityContainer()
        .RegisterType<ICommandHandlerAsync<RegisterMemberCommand>, RegisterMemberCommandHandler>()
        .RegisterType<ICommandHandlerAsync<UnregisterMemberCommand>, UnregisterMemberCommandHandler>()
        .RegisterType<ICommandHandlerFactory, CommandHandlerFactory>();

控制器将在其构造函数中接收工厂。操作方法将使用工厂分派命令:

代码语言:javascript
复制
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);
}

我已经在这把小提琴中设置了一个演示。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33449075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档