简单注入器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)

亲切的问候弗雷德里克

简单注入器3不返回一般实例

这是因为当你用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关键字标记接口,表明协方差和逆变是预期的,因此可能有多个适用的实现