2013-06-04 51 views
0

我有一種感覺,這只是我在Winforms中對DI的誤解。Ninject沒有注入現有的Winforms應用程序

我想實現Ninject到現有的winforms應用程序。在Program.cs中我做類似的東西,以

IKernel kernel = new StandardKernel(new NinjectBindings()); 
Application.Run(kernel.Get<MainContainer>()); 

我NinjectBindings有

Bind<IFilterEngine>().To<FilterEngine>(); 

然後在mainContainer上形式的一種形式客戶用戶控件(SearchResults.cs)我試圖使用方法注射像這樣

[Inject] 
public void AddFilterEngine(IFilterEngine filterEngine) 
{ 
    _filterEngine = filterEngine; 
} 

的應用程序編譯和運行然而細,我_filterEngine實例爲null並AddFilterEngine方法不會被調用。這是因爲SearchResults不是用Ninject創建的嗎?它的父代形式是硬編碼的。如果是這樣,我假設每個父母都需要使用Ninject創建?

回答

1

注入只發生在通過Ninject創建實例時,即通過調用Kernel.Get<T>()(通常只在應用程序內的「最高」位置完成)或Ninject自己創建此實例。

所以,除非通過調用Kernel.Get<SearchResult>()(假設該類被稱爲SearchResult)使用自綁定或容器(例如作爲構造函數參數)創建用戶控件,否則將不會調用您的方法。

0

您需要爲Ninject使用字段或屬性設置器以在對象創建時注入您的值。

[Inject] 
public IFilterEngine FilterEngine { get; set; } 

如果你不公開這個屬性,你也可以把它作爲參數傳遞給構造函數。這是首選的方法。請按照Ninject網站上的示例進行操作。

相關問題