Simple Injector - 使用+ =运算符(加上等于)订阅事件,如Ninject的OnActivation

时间:2017-04-19 16:34:38

标签: c# events event-handling simple-injector

我正在尝试使用Simple Injector订阅活动。我的班级有:

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

使用Ninject,可以使用OnActivation()

完成
Bind<MyClass>().ToSelf()
    .OnActivation((context, myObj) =>
    {
        myObj.SomeEvent += MyStaticEventHandler.Handle; // for static
        // or...
        myObj.SomeEvent += context.Kernel.Get<MyEventHandler>().Handle; // for non-static
    });

如何使用Simple Injector完成此操作?我试过四处寻找,但只在IEventHandler / ICommandHandler实现中找到了内容,没有使用C#事件。

1 个答案:

答案 0 :(得分:3)

Simple Injector中与Ninject的OnActivation相当的是RegisterInitializer。您的代码示例转换为以下Simple Injector代码:

container.Register<MyClass>();
container.RegisterInitializer<MyClass>(myObj =>
{
    myObj.SomeEvent += MyStaticEventHandler.Handle; // for static
    // or...
    myObj.SomeEvent += container.GetInstance<MyEventHandler>().Handle; // for non-static
});

但是,您通常应该使用构造函数注入作为一种机制,以便在使用事件时解除类。当针对接口编程时,您可以使用构造函数注入实现相同数量的解耦。

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

  • 容器可以为您分析对象图并检测任何配置缺陷,例如Captive Dependencies
  • 它提高了可发现性,因为界面不像事件那么抽象,这使读者能够理解类正在使用的内容并允许轻松导航到实现。
  • 它会阻止Temporal Coupling