簡體   English   中英

Ninject內核 <T> 實例創建

[英]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的正確行為嗎?

信息

  • 使用Ninject 3.2.2.0
  • C#5,.Net 4.5框架
  • WPF應用

您可以嘗試將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM