SimpleInjector.GetAllInstances抛出意外错误

时间:2016-03-22 10:20:01

标签: c# .net simple-injector

我有以下方法引发域事件。 IDomainEvent的实例将传递给该方法,并使用SimpleInjector的IDomainEventHandler方法提供的GetAllInstances实例进行处理。

方法如下:

public static void Raise<T>(T domainEvent) where T : IDomainEvent
{
    if (Container != null)
    {
        var handlerType =
            typeof(IDomainEventHandler<>).MakeGenericType(domainEvent.GetType());

        var handlers = Container.GetAllInstances(handlerType);

        foreach (dynamic handler in handlers)
        {
            handler.Handle((dynamic)domainEvent);
        }
    }
}
之前在包含此方法的类中提供了

Container,但它是SimpleInjector IContainer的一个实例。

IDomainEventHandler的示例NewOrderEvent如下所示:

 public class NewOrderEventHandler : IDomainEventHandler<NewOrderEvent>
 {
    public void Handle(NewOrderEvent args)
    {
        // Event handled here.
    }
 }

示例IDomainEvent看起来像:

public class NewOrderEvent : IDomainEvent
{
    public IOrder Order { get; set; }
}

IDomainEventHandler<>已在SimpleInjector注册:

var assemblies = new[] {
            // Other assemblies use this too
            typeof(NewOrderEventHandler).Assembly, // Event Handlers
        };

container.Register(typeof(IDomainEventHandler<>), assemblies);

当我运行该方法时,我得到以下异常:

  

无需注册类型   可以找到IEnumerable<IDomainEventHandler<NewOrderEvent>>。那里   但是,是IDomainEventHandler<NewOrderEvent>的注册;   你的意思是打电话给GetInstance<IDomainEventHandler<NewOrderEvent>>()   或依靠IDomainEventHandler<NewOrderEvent>

我不太明白为什么这不起作用 - 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

该错误让我相信您使用的是Register而不是RegisterCollection:使用Register注册的商品已使用GetInstance解决,注册RegisterCollection的商品已通过GetAllInstances解决。