Ninject Kernel.Get <t>实例创建</t>

时间:2014-10-09 15:25:25

标签: c# wpf dependency-injection ninject inversion-of-control

今天我在我的代码库中发现了一个错误,其中注入的依赖关系被认为是生活在它注入的类中。当我期望总是注入一个新的依赖实例时,我得到了一个旧实例。我设法通过从下面简化的代码段中删除行this.Kernel.Get<IA>()来清除错误。虽然这不是项目的完整图片,但它是用于犯罪者的确切配置。

internal sealed class MyNinjectModule : NinjectModule
{
    public override void Load()
    {
        this.Bind<IA>().To<A>();

        this.Bind<B>().ToSelf()
            .WithConstructorArgument(this.Kernel.Get<IDependencyOne>())
            .WithConstructorArgument(this.Kernel.Get<IDependencyTwo>())
            .WithConstructorArgument(this.Kernel.Get<IA>())
            .WithConstructorArgument<uint>(50U);
    }

因此,虽然我总是会得到B的新实例,但我会得到IA的旧实例。任何人都可以帮助我了解.Get<T> IResolutionRoot扩展方法的生命周期吗?我总是假设对.Get<T>的调用将根据我的绑定设置的先前配置生成实例。这是Ninject的正确行为吗?

信息

  • 使用Ninject 3.2.2.0
  • C#5,.Net 4.5 Framework
  • WPF申请

1 个答案:

答案 0 :(得分:3)

您可以尝试将lambda表达式传递给.WithConstructorArgument()

this.Bind<B>().ToSelf()
        .WithConstructorArgument(() => this.Kernel.Get<IDependencyOne>())
        .WithConstructorArgument(() => this.Kernel.Get<IDependencyTwo>())
        .WithConstructorArgument(() => this.Kernel.Get<IA>())
        .WithConstructorArgument<uint>(50U);

我认为你的代码在开始时得到IA,然后在检索时总是将它传递给B的构造函数。另一方面,应该在每次构造B时调用Lambda方法。

或者,您可以尝试仅在模块中指定命名的uint变量:

this.Bind<B>().ToSelf()
        .WithConstructorArgument<uint>("uintParamName", 50U);

Ninject应该解决剩余的参数,只要它们有绑定。