代码之家  ›  专栏  ›  技术社区  ›  ZeroBugBounce

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

  •  6
  • ZeroBugBounce  · 技术社区  · 16 年前

    在Ninject的依赖注入中,如果您设置类与自身的绑定,如下所示:

    Bind<SomeClass>().ToSelf();
    

    Ninject非常好地解析了某个类所具有的任何依赖项,并将对象返回给您。我希望能够对它每次创建新类时返回的someclass做一些事情,比如后处理事件。我可以使用.tomethod(或tofactorymethod)绑定来显式地更新它,但我希望ninject事先解决它的所有依赖项。

    如果你能做些像这样的事情,那就太好了:

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

    在ninject 1.0/1.1中有什么方法可以做到这一点吗?

    2 回复  |  直到 13 年前
        1
  •  13
  •   Nate Kohari    16 年前

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

        2
  •  10
  •   Kirk Woll    13 年前

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

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

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

    这样做的好处是,不需要在自己的类中(当然,除了模块之外)对ninject进行硬依赖烘焙,从而允许类型对最终使用的DI框架保持不可知性。

    推荐文章