具有域事件的简单注入器

时间:2017-02-22 09:07:53

标签: c# simple-injector

我试图将域事件实施到我的系统中,但是我被卡住了。我正在使用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。如何确保正确初始化?

1 个答案:

答案 0 :(得分:2)

  

IEventDispatcher Dispatcher始终为null。

Simple Injector不会为您神奇地初始化某些随机类的任何静态成员。只要你没有在启动时自己设置这个静态字段,就没人会。

但我会建议您停止使用此静态DomainEvent完全。这个设计植根于Udi Dahan的old article,但是他很久以前就放弃了为此目的使用静态类的想法。正如我一样,他目前正在反对它。

从可测试性和可发现性的角度来看,静态类很麻烦。从这个角度来看,使用依赖注入是一个更好的选择。

因此,您的问题的解决方案非常简单:从代码库中删除静态DomainEvents类,并将IEventDispatcher注入需要发布事件的使用者的构造函数中。