多种类型的用于SetHandlerInterface()与membus和IOC容器(multiple

2019-08-31 15:40发布

去在这里演示CQRS代码的命令和事件处理程序分别连接好,如下:

public interface CommandHandler<in T>
{
    void Handle(T command);
}

public interface EventHandler<in T>
{
    void Handle(T @event);
}

bus = BusSetup.StartWith<Conservative>()
       .Apply<FlexibleSubscribeAdapter>(a =>
       {
           a.ByInterface(typeof(IHandleEvent<>));
           a.ByInterface(typeof(IHandleCommand<>));
       })
       .Construct();

我使用IoC容器钩与membus和它通过实现工作的梦IEnumerable<object> GetAllInstances(Type desiredType)与我的容器界面,然而不像登记的该方法中,演示我不能分割出来单独的命令接口和事件:

this.Bus = BusSetup.StartWith<Conservative>()
    .Apply <IoCSupport>(c =>
        {
            c
            .SetAdapter(SimpleInjectorWiring.Instance)
            .SetHandlerInterface(typeof(CommandHandler<>))
            /*.SetHandlerInterface(typeof(EventHandler<>))*/;
            // only CommandHandler or EventHandler can be used - not both
        })
    .Construct();

任何人都可以请让我知道如果没有解决这个办法,所以我们可以为类型的任意数量的注册?

Answer 1:

恐怕MemBus的当前版本无法做到这一点 - 没有特殊原因,请不要忘记。 我知道,这是有道理的,能够事件和命令来区分,即使底层的基础架构是相同的。

唯一的解决办法,现在是使用一个单一的界面给国际奥委会挂钩到MemBus。

如果这样的特征,应引入MemBus一个必须考虑的查找机制引入IOC容器应该怎么样子。 或许,这将有权要求所有接口,或某种方式进行分类/事件和命令区分的所有处理程序“的消息”将不得不出台。



Answer 2:

我只是设置此为概念,因为我用的每以下约定的证明微软CQRS之旅指南 :

  • 可以有每个命令只有一个CommandHandler
  • 可以有每个事件的许多事件处理

我想使用IOC容器的(SimpleInjector)API执行该公约,因为它迫使你做单VS多处理器的注册设计明确 。 现在,我的IOC容器将抛出随时为同一命令两个处理程序被无意中注册一个例外。

为了得到MemBus支持这个公约,我需要创建自己的ISetup,ISubscriptionResolver和IoCAdapter(分别开始从IoCSupport,IoCBasedResolver和IocAdapter的代码)。 我也不得不创建一个新的IocAdapter接口同时支持单数getInstance()方法; 现在的界面大致匹配的System.Web.Http.Dependencies.IDependencyScope接口(GetService的和GetServices)。

// Setup
return BusSetup
    .StartWith<Conservative>()
    .Apply<CommandingEventingSupport>(
        adapter =>
            {
                adapter.SetAdapter(new MemBusSimpleInjectorAdapter(container));
                adapter.SetCommandHandlerInterface(typeof(IHandleCommand<>));
                adapter.SetEventHandlerInterface(typeof(IHandleEvent<>));
                adapter.SetCommandTest(obj => obj is IDomainCommand);
            })
    .Construct();

然后解析器分派给的GetInstance命令和事件GetAllInstances ...

    // Command vs Event
    public IEnumerable<ISubscription> GetSubscriptionsFor(object message)
    {
        bool isCommand = _isCommandFunc(message);
        Type typeToCreate = isCommand
            ? _commandHandlerType 
            : _eventHandlerType;
        var handlesType = ConstructHandlesType(typeToCreate, message.GetType());
        var mi = handlesType.GetRuntimeMethods().First();
        return isCommand
                   ? new[] { mi.ConstructSubscription(_adapter.GetInstance(handlesType)) }
                   : _adapter.GetAllInstances(handlesType).Select(mi.ConstructSubscription);
    }


文章来源: multiple types for SetHandlerInterface() with membus and ioc container
标签: cqrs membus