2017-07-24 68 views
0

我的WPF桌面應用程序正試圖使用​​Ninject注入一些接口依賴關係,如下所示。該應用程序的啓動是這樣的,(我認爲)自動生成:Ninject無法解析WPF中的構造函數注入

void App_Startup(object sender, StartupEventArgs e) 
{ 
    IKernel _Kernel = new StandardKernel(); 
    _Kernel.Load(Assembly.GetExecutingAssembly()); 
} 

然後我有一個NinjectModel -extending類,其Load方法得到由上面的調用,並且發生結合,像這樣:

Bind<Inheritance.IWindowProvider>().To<WindowProvider>().InSingletonScope(); 

我的視圖模型然後採取IWindowProvider,在這種情況下,我還添加了[Inject]屬性。

[Inject] 
public LoginDetailsVM (IWindowProvider windowProvider) { 
    this.WindowProvider = windowProvider; 
} 

別處然後(在另一個VM),我想使這個視圖模型的實例:

IKernel kernel = new StandardKernel(); 
LoginDetailsVM loginDetails = kernel.Get<LoginDetailsVM>(); 

但是我得到的 「可怕的」 錯誤:

Error activating IWindowProvider

No matching bindings are available, and the type is not self-bindable.

我最初的搜索是,我實例化兩次可能是StandardKernel問題,但我不確定如何訪問它,否則。

當然,必須傳遞一個內核實例有點失敗的注射點之一?

此外,是否明確Get<T>()形式獲得實例的公認的選擇,或者是否有更好的隱式方法調用注入的構造函數?

對於這裏可能看起來天真的理解的道歉,我對Ninject和DI一般都是全新的。

+0

請在您的文章中包含'WindowProvider'的源代碼。 – mjwills

+0

https://stackoverflow.com/a/38347614/34092有幫助嗎? – mjwills

+0

@mjwills'IWindowProvider'只包含兩個方法,這些方法由'WindowProvider'實現,它也包含一個公共的空白構造函數。 我試過鏈接的文章,但得到了空引用異常。 – Dan

回答

3

這個問題並沒有通過內核 - 它是你訪問它的地方。如果你在組合根目錄之外引用它(App_Startup),那麼創建一個新的並不比傳遞已經創建的那個更好。

如果您需要解決組合根以外的問題,並且不想引用容器,則一種解決方案是創建工廠。您需要解決問題的組件不會向容器詢問它 - 它會向工廠詢問它。

工廠反過來設置爲從容器中解決它。但是,這是在你的組合根中設置的,工廠可以用不涉及容器的實現來替換。所以你仍然可以說你的組件不依賴於或談論容器。

Here's some documentation關於配置Ninject將實例提供給工廠。

0

想象一個IOC容器,就像一個魔術字典,其中存儲了類型和對象實例。

如果你沒有

Void a method(){ 
Var dictionary = new dictionary(); 

dictionary.Add(typeof(IFOO), new Foo()); 
} 

Void other_method(){ 

Var dictionary = new dictionary(); 
IFOO instance =Dictionary[typeof(IFOO)]; 
// would you expect this to work? 
} 

通常單件模式被用來提供訪問一個IOC容器。