[英]Ninject different behaviour between Kernel.Get and Constructor Injection
[英]Ninject Kernel.Get<T> Instance Creation
今天,我在我的代碼庫中發現了一個錯誤,據稱其中存在一個注入的依賴項,使該依賴項不再存在於被注入的類中。 當我希望總是注入一個新的依賴實例時,我就得到了一個舊的實例。 我設法通過從下面的簡化代碼段中刪除了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
的舊實例。 誰能幫助我了解IResolutionRoot
的.Get<T>
擴展方法的生命周期? 我一直以為,對.Get<T>
的調用將根據綁定所設置的先前配置生成一個實例。 這是Ninject的正確行為嗎?
您可以嘗試將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應該解析其余的參數,只要它們具有綁定即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.