C# 简单注入器-使用+;订阅事件运算符(加等于),如Ninject';非激活

C# 简单注入器-使用+;订阅事件运算符(加等于),如Ninject';非激活,c#,events,event-handling,simple-injector,C#,Events,Event Handling,Simple Injector,我正在尝试使用Simple Injector订阅一个事件。我的班级有: public class MyClass { public event Action<MyClass> SomeEvent; //... } 如何使用简单的喷油器进行此操作?我试着四处看看,但只在IEventHandler/ICommandHandler实现上找到了内容,没有一个使用C#事件。与简单注入器中Ninject的OnActivation等效的是注册表初始化器。您的代码示例转换为以下简单

我正在尝试使用Simple Injector订阅一个事件。我的班级有:

public class MyClass
{
    public event Action<MyClass> SomeEvent;
    //...
}

如何使用简单的喷油器进行此操作?我试着四处看看,但只在
IEventHandler
/
ICommandHandler
实现上找到了内容,没有一个使用C#事件。

与简单注入器中Ninject的
OnActivation
等效的是
注册表初始化器
。您的代码示例转换为以下简单的喷油器代码:

container.Register<MyClass>();
container.RegisterInitializer<MyClass>(myObj =>
{
    myObj.SomeEvent += MyStaticEventHandler.Handle; // for static
    // or...
    myObj.SomeEvent += container.GetInstance<MyEventHandler>().Handle; // for non-static
});
container.Register();
container.RegisterInitializer(myObj=>
{
myObj.SomeEvent+=MyStaticEventHandler.Handle;//用于静态
//或者。。。
myObj.SomeEvent+=container.GetInstance().Handle;//用于非静态
});
但是,您通常更喜欢使用构造函数注入作为一种机制来解耦类,而不是使用事件。当您针对接口编程时,可以通过构造函数注入实现相同数量的解耦

使用构造函数注入具有以下优点:

  • 容器可以为您分析对象图,并检测任何配置陷阱,例如
  • 它提高了可发现性,因为接口没有事件那么抽象,这允许读者理解类正在使用什么,并允许轻松导航到实现
  • 它可以防止

太棒了!回答得很好,我一定会重新考虑我设计的这一部分,非常感谢!
container.Register<MyClass>();
container.RegisterInitializer<MyClass>(myObj =>
{
    myObj.SomeEvent += MyStaticEventHandler.Handle; // for static
    // or...
    myObj.SomeEvent += container.GetInstance<MyEventHandler>().Handle; // for non-static
});