2009-12-27 130 views
4

我正在處理使用Ninject作爲IoC容器處理動態注入的框架擴展,但我在嘗試解決如何實現這一點時遇到了一些麻煩。與Ninject的後期綁定

我的框架的期望是,你會因此它可以很容易地在MVC,WebForms的,等使用的IModule(s)所以我的類結構像這樣通過:

public class NinjectFactory : IFactory, IDisposable { 
    readonly IKernel kernel; 
    public NinjectFactory(IModule[] modules) { 
    kernel = new StandardKernel(modules); 
    } 
} 

這是好的,我可以在單元測試中創建一個實例,並通過IModule的基本實現(使用InlineModule中的構建,這似乎是推薦用於測試的構建)。

的問題是,它不是直到運行時,我知道是什麼類型(S)我需要注入,它們通過我擴展框架的要求,在這樣的方法:

public IInterface Create(Type neededType) { 

} 

這裏的地方我很爲難,我不知道要入住的最好辦法>創建(如果需要) - >回,我有這個至今:

public IInterface Create(Type neededType) { 
    if(!kernel.Components.Has(neededType)) { 
    kernel.Components.Connect(neededType, new StandardBindingFactory()); 
    } 
} 

這也增加了組件集合,但我不能解決它是否創建了一個實例,或者我如何創建一個實例並傳入的參數。

我是以正確的方式去做的,還是Ninject不打算用這種方式?

回答

7

除非你想改變或擴展Ninject的內部,你不需要在內核的Components集合中添加任何東西。要確定某種類型的裝訂是否可用,您可以執行如下操作:

Type neededType = ...; 
IKernel kernel = ...; 

var registry = kernel.Components.Get<IBindingRegistry>(); 
if (registry.Has(neededType)) { 
    // Ninject can activate the type 
}