我试图将域事件实施到我的系统中,但是我被卡住了。我正在使用SimpleInjector,我想我错过了一些东西。
域名事件:
public static class DomainEvent
{
public static IEventDispatcher Dispatcher { get; set; }
public static void Raise<T>(T @event) where T : IDomainEvent
{
Dispatcher.Dispatch(@event);
}
}
SimpleInjectorEventDispatcher
public class SimpleInjectorEventDispatcher : IEventDispatcher
{
private readonly Container container;
public SimpleInjectorEventDispatcher(Container container)
{
this.container = container;
}
public void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent
{
var handlerType = typeof(IDomainHandler<>).MakeGenericType(eventToDispatch.GetType());
var handlers = this.container.GetAllInstances(handlerType);
foreach (dynamic handler in handlers)
{
handler.HandleEvent((dynamic)eventToDispatch);
}
}
}
SimpleInjector
container.Register<IEventDispatcher, SimpleInjectorEventDispatcher>();
IEventDispatcher Dispatcher始终为null。如何确保正确初始化?
答案 0 :(得分:2)
IEventDispatcher Dispatcher始终为null。
Simple Injector不会为您神奇地初始化某些随机类的任何静态成员。只要你没有在启动时自己设置这个静态字段,就没人会。
但我会建议您停止使用此静态DomainEvent
类完全。这个设计植根于Udi Dahan的old article,但是他很久以前就放弃了为此目的使用静态类的想法。正如我一样,他目前正在反对它。
从可测试性和可发现性的角度来看,静态类很麻烦。从这个角度来看,使用依赖注入是一个更好的选择。
因此,您的问题的解决方案非常简单:从代码库中删除静态DomainEvents
类,并将IEventDispatcher
注入需要发布事件的使用者的构造函数中。