在Ninject中,如何在使用Bind< ..> .ToSelf()创建对象后,在对象上运行自定义代码?

时间:2009-07-24 17:50:41

标签: dependency-injection ninject

在Ninject的依赖注入中,如果你像这样设置类的绑定:

Bind<SomeClass>().ToSelf();

Ninject很好地解析了SomeClass所有的依赖关系,并为你提供了对象。我希望能够在每次创建新事件时返回它返回的SomeClass,就像后处理事件一样。我可以使用.ToMethod(或ToFactoryMethod)绑定来显式地修改它,但我希望它的所有依赖项都可以事先由Ninject解决。

做一些像这样的事情会很好:

Bind<SomeClass>()
    .ToSelf()
    .After(sc => sc.MethodIWantToCall()); // then after here, Ninject returns the object.

在Ninject 1.0 / 1.1中有没有办法做到这一点?

2 个答案:

答案 0 :(得分:13)

如果您无法在构造函数中放置要执行的代码,则可以实现IInitializableIStartable。前者提供了一个Initialize()方法,在所有注入完成后调用,后者提供Start()Stop()方法,分别在激活和停用期间调用。

答案 1 :(得分:10)

我遇到了同样的问题,但我无法使用Nate的解决方案,因为我无法创建类型实现IInitializable。如果您在类似的船上,可以使用.OnActivation并避免必须修改目标类型的定义:

Bind<SomeClass>().ToSelf().OnActivation(x => ((SomeClass)x).MyInitialize());

您可以看到在激活(实例化)类时我们如何调用一些任意初始化方法(MyInitialize)。

这样做的好处是不会在你自己的类中对Ninject进行硬依赖(当然除了模块之外),因此允许你的类型对你最终使用的DI框架保持不可知。