2011-07-07 31 views
1

我正在分析使用Ninject for DI的應用程序。隨着時間的推移,我看到很多BindingBuilder類的實例,它用於定義容器中定義的對象。.NET內存分析/泄漏風險/ Ninject/Direct委託根

Ninject的「ToMethod」綁定用於定義容器中的所有對象。訪問內核的lamba中可用的上下文然後用於從容器中檢索其他對象。例如:

Bind<IService>() 
    .ToMethod(ctx => new CustomService(
     ctx.Kernel.GetDefault<IOtherService>(), 
     ctx.Kernel.GetDefault<IAnotherService>() 
    )) 
    .InSingletonScope(); 

看到BindingBuilders隨着時間增加還是應該只存在一次是正常行爲?

回答

2

ToMethod在BindingBuilder內爲lambda表達式創建一個新的匿名類。你所看到的並不是BindingBuilder的一個實例,但類似於BindingBuilder<T>+c__DisplayClass1<IService>

此外,您沒有按照預期使用Ninject。上面的綁定可以寫得更容易。讓Ninject決定要注入什麼而不是添加一個explizit定義。

Bind<IService>().To<CustomService>.InSingletonScope(); 
+0

感謝您的支持。我們擁有它的原因是我們已經命名了我們特別想要注入的實例,因此我們可以爲給定的接口定義兩個具有不同名稱的實現。我們如何讓Ninject決定在這種情況下使用的? –

+0

這是一個完全不同的故事,取決於有多個實現的原因。 這個問題的答案是沒有BindingBuilder沒有內存泄漏。 –

+0

這很好,我推測不會有。你期望通過BindingBuilder路由看到匿名類的漸進式構建嗎?你有沒有任何關於命名實例的指導和注入這些實例的最佳方法。我認爲我們正在使用推薦的方法,但他們可能是一個更好的方法來做到這一點? –