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

Zer*_*nce 6 dependency-injection ninject

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

Bind<SomeClass>().ToSelf();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Nat*_*ari 14

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


Kir*_*oll 10

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

Bind<SomeClass>().ToSelf().OnActivation(x => ((SomeClass)x).MyInitialize());
Run Code Online (Sandbox Code Playgroud)

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

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