2013-06-28 49 views
0

從卡利微文檔中提取的EventAggregator:進樣EventAggregator到視圖模型與卡利微

// Creating the EventAggregator as a singleton. 
public class Bootstrapper : BootstrapperBase { 
    private readonly SimpleContainer _container = 
     new SimpleContainer(); 

    // ... Other Bootstrapper Config 

    protected override void Configure(){ 
     _container.Singleton<IEventAggregator, EventAggregator>(); 
    } 

    // ... Other Bootstrapper Config 
} 

// Acquiring the EventAggregator in a viewModel. 
public class FooViewModel { 
    private readonly IEventAggregator _eventAggregator; 

    public FooViewModel(IEventAggregator eventAggregator) { 
     _eventAggregator = eventAggregator; 
    } 
} 

所以,你如何EA的情況下通過引導程序創建注入到你的虛擬機的問題?

var svm = new SomeViewModel(?);

我嘗試使用Caliburn.Micro.IoC.Get方法,但沒有奏效...

回答

6

不,你不var svm = new SomeViewModel(?)因爲服務不使用IoC.Get位置正在成爲反模式。
本文作者建議的模式是最佳實踐,即您應該通過構造函數注入將您的依賴注入到需要它們的對象中。
我不知道該如何用其他方式說出來,而是讓你的應用程序可組合併爲你的表示層創建一個架構。
我會檢查Screens, Conductors and Composition文章,因爲它有一些偉大的想法與我所說的相關,並伴隨它的應用程序是一個偉大的想法。
我也會閱讀關於依賴注入。

+1

這只是一個例子,一旦你添加IEventAggregator eventAggregator到ViewModel的構造函數,並且你不再有默認的構造函數,你必須通過一個EA的實例,當你實例化你的VM時......我的問題是如何讓實例通過它進入虛擬機的構造... –

+2

@DeanKuga這是我的觀點,你不會手動創建視圖模型,你讓CaliburnMicro從引導程序爲你創建整個對象圖,並且如果你有一個ViewModel你通過接收eventAggregator構造函數,通過只讀實例變量保存對它的引用,並在ViewModel中使用此實例,如果該ViewModel需要手動創建其他構造函數中帶有IEventAggregator的ViewModel。 –

1

我寫了你參考的文章。嗅探器是正確的(請留下綠色的勾號)。 Caliburn.Micro大量投資於一個名爲構圖的概念。這意味着整個對象圖在運行時隱式構造,或者如果您願意,可以構成。

這個想法是,你的「外殼」ViewModel是由引導程序創建的,外殼依次創建其他ViewModel等等。這允許使用構造函數注入並提供最佳的可組合性。

但是,有時候這不是所需的功能,因爲我們通過IoC類提供服務定位器;正如Sniffer所說,大多數用於服務位置的使用案例都被認爲是反模式,因此它的使用應該嚴格審查,否則它會咬你的屁股。

我正在完成對IoC和我們內置的依賴容器SimpleContainer的兩篇新文章的收尾工作,一旦這些文章完成了,我會將相關鏈接添加到EventAggregator文檔中,該文檔應提供更多有關注入網站和最佳環境的鏈接實踐。

+0

你有這些鏈接嗎?對將「UserControls」添加到需要依賴注入的View的「正確」方式非常感興趣。 Caliburn.Micro新手。 – faldeland

+0

兩者現在分別位於EventAggregator和SimpleContainer下http://caliburnmicro.codeplex.com/documentation – McDonnellDean