【问题标题】:Simple Injector 3 does not return general instancesSimple Injector 3 不返回一般实例
【发布时间】:2015-08-20 08:04:41
【问题描述】:

我正在使用 Simple Injector,并且刚刚从 v2 更新到 v3。 我正在使用 DI 容器将关联的事件处理程序解析为事件。

所有事件处理程序都实现接口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)

亲切的问候 弗雷德里克

【问题讨论】:

  • 我假设您的真实注册使用的是RegisterCollection?

标签: c# dependency-injection simple-injector


【解决方案1】:

这是因为 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>>();

【讨论】:

  • 这个问题一直弹出。是否可以定义有助于检测此类错误注册的诊断警告?
  • @Maarten:这是一个有趣的观点。我认为这里真正的问题是即使您尚未注册,Simple Injector 也会为您解析集合。我认为这是一个设计缺陷,但我认为这是一个太大的突破性变化。我们将不得不等待 v4 :'(。我不确定诊断是否会有所帮助,因为用户通常会在查看诊断消息之前发现此错误。
  • @Maarten 我很高兴地说this 比 v4 早解决了 :-)
【解决方案2】:

您需要在接口定义中明确说明差异

public interface IDomainEventHandler<in TDomainEvent> { }

用 in 和 out 关键字标记接口表明协变和逆变是预期的,因此可能有多个适用的实现

详情请参阅here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    相关资源
    最近更新 更多