我正在使用Simple Injector,只是从v2更新到v3。 我正在使用DI容器来解析事件的相关事件处理程序。
所有EventHandlers都实现了接口IDomainEventHandler
,所有事件都实现了IDomainEvent
。
EventHandlers已注册:
container.Register(typeof(IDomainEventHandler<>),
new[] { typeof(IDomainEventHandler).Assembly });
我将所有处理程序收集到某个特定事件中:
public void Dispatch<TDomainEvent>(TDomainEvent domainEvent)
where TDomainEvent : IDomainEvent
{
var eventHandlers =
_dependencyResolver.GetAllInstances<IDomainEventHandler<TDomainEvent>>();
foreach (var domainEventHandler in eventHandlers)
domainEventHandler.Handle(domainEvent);
}
我有一个通用事件处理程序,它处理所有实现IDomainEvent
接口的事件。它的定义如下:
public class EventStoreDomainEventHandler : IDomainEventHandler<IDomainEvent>
{
public void Handle(IDomainEvent domainEvent)
{ ... }
}
当我尝试从实现IDomainEvent
界面的某个事件的DI容器中获取所有实例时,我没有收到EventStoreDomainEventhandler
的实例。
有没有办法注册和获取某个类型的所有处理程序,以及与该类型实现的接口相关的所有处理程序?
希望有道理:o)
亲切的问候 弗雷德里克
答案 0 :(得分:2)
这是因为Simple Injector separates registration of collections from one-to-one mappings,当您使用Register
注册处理程序时,使用GetAllInstances
解析它们。您应该使用以下组合:
container.Register(typeof(IDomainEventHandler<>), assemblies);
_dependencyResolver.GetInstance<IDomainEventHandler<TDomainEvent>>();
或:
// NOTE: v4.3+ syntax
container.Collection.Register(typeof(IDomainEventHandler<>), assemblies);
_dependencyResolver.GetAllInstances<IDomainEventHandler<TDomainEvent>>();
答案 1 :(得分:2)
您需要在接口定义中明确说明 中的方差
public interface IDomainEventHandler<in TDomainEvent> { }
用in和out关键字标记接口,表明预期协方差和逆变,因此可能存在多种适用的实现
有关详细信息,请参阅here。