Simple Injector 3不返回一般实例

时间:2015-08-20 08:04:41

标签: c# dependency-injection simple-injector

我正在使用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)

亲切的问候 弗雷德里克

2 个答案:

答案 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