我有以下方法引发域事件。 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>
?
我不太明白为什么这不起作用 - 有人可以帮忙吗?
答案 0 :(得分:4)
该错误让我相信您使用的是Register
而不是RegisterCollection
:使用Register
注册的商品已使用GetInstance
解决,注册RegisterCollection
的商品已通过GetAllInstances
解决。