2011-02-11 115 views
1

我正在學習如何使用Caliburn.Micro作爲WPF應用程序的MVVM框架。在視圖X中,我想使用ActivateItem顯示另一個視圖Y.在這個視圖中,當用戶點擊一個按鈕時,我需要顯示另一個視圖Z作爲對話框。所以我需要在視圖Y中的WindowManager的一個實例。Caliburn.Micro activateitem和Ioc注入IWindowManager

這意味着windowmanager必須注入Y的viewmodel,所以我可以用它來調用windowManager.ShowDialog()來查看Z. 所以我是認爲我應該將一個構造函數添加到接受IWindowManager參數的Y的viewmodel中。

公共YViewModel(IWindowManager窗口管理器){...}

能自動Caliburn.Micro注入viewmanager的實例爲YViewModel?沒有windowmanager我會寫

ActivateItem(new YViewModel());

但是,當我需要windowmanager時,這不起作用...當YViewModel需要windowmanager的一個實例時,我想如何編寫ActivateItem?

+0

目前我解決它通過從構造參數除去IWindowManager和通過將碼在構造: _windowManager = IoC.Get (); – rekna 2011-02-19 08:56:38

回答

3

Caliburn.Micro本身不是IoC容器。它的內置引導程序有一個簡單的IoC實現(而不是服務定位器),它不能像IWindowManager構造函數參數那樣執行依賴注入。

雖然您的解決方案只能在簡單情況下執行,但從您的類中調用服務定位器也被認爲是不好的做法。

周圍有很多好的IoC容器。我建議看看Unity或Autofac。因爲你會在互聯網上找到適合的Caliburn.Micro bootstrappers。

在Autofac例如你有一個像線:

builder.Register<IWindowManager>(c => new MyWindowManager()).InstancePerLifetimeScope(); 

您的自定義Autofac引導程序裏面。每當YViewModel通過IoC容器實例化時,MyWindowManager的同一個實例就會被注入。

0

如果你從來沒有使用自定義的窗口管理器實現IWindowManager,我想如果你直接使用new關鍵字實例化的窗口管理器,它的確定。

如果您使用的是NuGet軟件包,您會看到默認的Caliburn引導程序使用MEF作爲ServiceLocator,在覆蓋方法「Configure」上註冊「IWindowManager」。

具有自定義IOC/DI使用,你必須創建自己的引導程序類,以下爲指導MEF引導程序,做必要的登記爲IWindowManager,IEventAgreggator等

目前我確定與默認caliburn micro的MEF bootstrapper版本,但是如果我使用IoC/DI容器,那麼肯定會使用SimpleInjector。