【发布时间】:2017-10-14 19:21:30
【问题描述】:
我有这个接口的多个实现:
public interface IDomainEventHandler<TDomainEventContext>
where TDomainEventContext : IDomainEventContext
{
void Handle(TDomainEventContext context, object sender);
}
我想根据事件上下文的类型在运行时解决其中的一些问题,所以我在我的系统中添加了类型化工厂:
ublic interface IDomainEventHandlerFactory : IDisposable
{
IEnumerable<IDomainEventHandler<TDomainEventContext>> ResolveAll<TDomainEventContext>()
where TDomainEventContext : IDomainEventContext;
}
这是我的注册:
container.Register(Classes.FromAssemblyContaining<SomeClass>().
BasedOn(typeof(IDomainEventHandler<>)).WithServiceAllInterfaces().
LifestyleTransient());
现在我想做下一件事:
将 Name 属性添加到 IDomainEventHandler 接口:
public interface IDomainEventHandler<TDomainEventContext>
where TDomainEventContext : IDomainEventContext
{
string Name { get; }
void Handle(TDomainEventContext context, object sender);
}
然后我想用这个 Name 属性注册每个事件处理程序(按照约定),然后我希望能够解析所有具有相同名称(和相同类型的事件上下文)的组件
我希望我的目标足够明确
所以我的问题是:
1) 我是如何进行注册部分的(针对我界面中的名称字段)?
2) 两个事件处理程序是否可以使用相同的名称注册?
3) 工厂应该是什么样子?
再次,我的目标是能够说:我希望所有事件处理程序处理类型为“AddingItemEventContext”的事件上下文,但只有名称为“ElectronicItem”的事件处理程序(然后我得到所有与我相关的处理程序)
【问题讨论】:
-
这听起来很适合Strategy Pattern。有关为单个事件选择多个服务的实现,请参阅 Dependency injection type-selection。
标签: c# dependency-injection castle-windsor