去在这里演示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();
任何人都可以请让我知道如果没有解决这个办法,所以我们可以为类型的任意数量的注册?
恐怕MemBus的当前版本无法做到这一点 - 没有特殊原因,请不要忘记。 我知道,这是有道理的,能够事件和命令来区分,即使底层的基础架构是相同的。
唯一的解决办法,现在是使用一个单一的界面给国际奥委会挂钩到MemBus。
如果这样的特征,应引入MemBus一个必须考虑的查找机制引入IOC容器应该怎么样子。 或许,这将有权要求所有接口,或某种方式进行分类/事件和命令区分的所有处理程序“的消息”将不得不出台。
我只是设置此为概念,因为我用的每以下约定的证明微软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);
}