简单注入器3不返回一般实例
本文关键字:实例 返回 注入器 简单 | 更新日期: 2023-09-27 18:08:48
我使用简单的注入器,刚刚从v2更新到v3。我使用DI容器来解析与事件相关的事件处理程序。
所有eventhandler实现接口IDomainEventHandler
,所有事件实现IDomainEvent
。
eventhandler已注册:
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
的实例。
是否有一种方法可以注册并获得类型的所有处理程序,以及与该类型实现的接口相关的所有处理程序?
希望它有意义:0)
亲切的问候弗雷德里克
这是因为当你用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>>();
您需要在您的接口定义中显式地声明方差
public interface IDomainEventHandler<in TDomainEvent> { }
用in和out关键字标记接口,表明协方差和逆变是预期的,因此可能有多个适用的实现