我正在尝试使用简单喷油器订阅事件。我的课有:
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
});
这是如何用简单喷油器完成的?我尝试环顾四周,但仅在IEventHandler
/ICommandHandler
实现上找到内容,没有使用C#事件。
简单喷油器中与Ninject的OnActivation
等效的是RegisterInitializer
。您的代码示例转换为以下简单喷油器代码:
container.Register<MyClass>();
container.RegisterInitializer<MyClass>(myObj =>
{
myObj.SomeEvent += MyStaticEventHandler.Handle; // for static
// or...
myObj.SomeEvent += container.GetInstance<MyEventHandler>().Handle; // for non-static
});
但是,您通常应该更喜欢使用构造函数注入作为一种机制,以将类别用于使用事件的类别。当您针对接口。。
使用构造函数注入的优点是:
- 容器可以为您分析对象图,并检测任何配置陷阱,例如圈养依赖。
- 它提高了可发现性,因为接口不如事件抽象,这使读者可以理解类使用的内容并允许轻松导航到实现。
- 它可以防止时间耦合。