今天我在我的代码库中发现了一个错误,其中注入的依赖关系被认为是生活在它注入的类中。当我期望总是注入一个新的依赖实例时,我得到了一个旧实例。我设法通过从下面简化的代码段中删除行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的正确行为吗?
答案 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应该解决剩余的参数,只要它们有绑定。