2012-01-03 50 views
6

我有以下代碼如何使用提供商Ninject

public class Something { 
    [Inject] 
    public Configuration config {get;set;} //singleton 
    [Inject] 
    public Provider<WindowHandler> windowsProvider { get; set; } //NOT singleton 

    public void Search(string text) { 
     WindowHandler handler = windowsProvider.Create(xxxxxx); 
     //use the new handler that was created 
    } 
} 

但似乎提供商需要一個IContext這裏我把XXXXXX。不應該使用從內核引導和創建Something.cs時的IContext。提供者的no參數Create方法在哪裏? (我是從Guice陸地角度來的,它會像上面那樣編碼)。

所以問題是如何正確地做到這一點?

感謝, 院長

回答

12

似乎你試圖用一個供應商在你的代碼的工廠。

Ninject條款中的提供者是賦予Ninject創建專門創建的對象的工廠。因此,它獲得解析上下文,該解析上下文可用於創建不同的實例,具體取決於實例注入的位置。

public class FooProvider : Provider<IFoo> 
{ 
    public override IFoo CreateInstance(IContext ctx) 
    { 
     // add here your special IFoo creation code 
     return new Foo(); 
    } 
} 

kernel.Bind<IFoo>().ToProvider<FooProvider>(); 

你需要的是你的編碼器工廠創建的WindowHandler一個實例。因此創建一個接口來創建實例是這樣的:

public interface IWindowHandlerFactory 
{ 
    WindowHandler Create(); 
} 

Bind<IWindowHandlerFactory>().ToFactory(); 

或者你可以注入Func<WindowHandler>不添加配置。但在我看來,這是沒有意義的。

注意:所有這些都需要Ninject.Extensions.Factory作爲Nuget的預發行版3.0.0-rc2提供。

參見:http://www.planetgeek.ch/2011/12/31/ninject-extensions-factory-introduction/

+0

Func 正是我一直在尋找的東西。在2.0版本中我們使用的版本是否沒有辦法做到這一點? – 2012-01-03 21:57:57

+1

請參閱http://stackoverflow.com/questions/4840157/does-ninject-support-func-auto-generated-factory/4851885#4851885 – 2012-01-04 00:05:57

1

好吧,我最終的解決辦法是在ninject 2.0用下面的代碼來欺騙......

 var windowFactory = kernel.Get<IEWindowFactory>(); 
     var tabFactory = kernel.Get<IETabFactory>(); 
     windowFactory.Kernel = kernel; 
     tabFactory.Kernel = kernel; 

,並在綁定名單上有

Bind<IEWindowFactory>().ToSelf().InSingletonScope(); 
Bind<IETabFactory>().ToSelf().InSingletonScope(); 

然後我剛開始我的應用程序

var main = kernel.Get<MainForm>(); 
main.Start(); 

當然,這些工廠在MainForm的層次結構中注入了我需要的地方。

所以我手動把內核啓動時,然後當我啓動我的應用程序時,自然這些工廠是與[Ninject]註釋類中的字段,因此他們可以創建對象。不是最乾淨的,直到我們得到3.0,但它的工作原理(我討厭額外的工廠類,我必須編寫代碼,但哦)。