C# 具有域事件的简单注入器

C# 具有域事件的简单注入器,c#,simple-injector,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.D

我试图在我的系统中实现域事件,但我被卡住了。我正在使用SimpleInjector,我想我遗漏了一些东西

域事件:

public static class DomainEvent
{
    public static IEventDispatcher Dispatcher { get; set; }

    public static void Raise<T>(T @event) where T : IDomainEvent
    {
        Dispatcher.Dispatch(@event);
    }

}
公共静态类DomainEvent
{
公共静态IEventDispatcher调度程序{get;set;}
公共静态无效提升(T@event),其中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);
        }
    }
}
公共类SimpleInjectorEventDispatcher:IEventDispatcher
{
专用只读容器;
公共SimpleInjectorEventDispatcher(容器)
{
this.container=容器;
}
公共无效调度(TEvent eventToDispatch),其中TEvent:IDomainEvent
{
var handlerType=typeof(IDomainHandler).MakeGenericType(eventToDispatch.GetType());
var handlers=this.container.GetAllInstances(handlerType);
foreach(处理程序中的动态处理程序)
{
HandleEvent((动态)eventToDispatch);
}
}
}
简单喷射器

container.Register<IEventDispatcher, SimpleInjectorEventDispatcher>();
container.Register();
IEventDispatcher调度程序始终为空。如何确保它的初始化正确

IEventDispatcher调度程序始终为空

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

但是,我敦促您完全停止使用这个静态
DomainEvent
class。这个设计源于Udi Dahan的一篇文章,但是他自己很久以前就放弃了使用静态类来实现这个目的的想法。他和我目前都在建议反对

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


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

感谢您的详细回答!我将接受你的建议,放弃静态课程。这是否意味着我的所有实体都需要接受IEventDispatcher?实体的构造函数?否。实体不应使用构造函数注入获取其依赖项。如果您希望应用DDD,您应该使用方法注入,即实际使用依赖项的实体方法应该通过其方法要求它。再次感谢!另一个相关问题:SimpleInjectEventDispatcher有一个容器字段。如何设置该字段以使用SimpleInjectorConfiguration中的容器?您不必做任何事情。您已经将其作为构造函数参数提供。简单的注射器会自动注射。哦,哇,我不知道。我现在就试试,然后再给你回复。谢谢你的时间和回答!