2014-09-27 73 views
2

我正在使用MVVM設計模式創建WPF應用程序。我最近纔開始學習這兩種方法,但對基礎知識的工作方式掌握得很好。如何使用MVVM模式創建和組織非UI相關元素

應用程序將具有與UI無關的類,例如網絡線程和消息處理程序,以及用於保存和加載設置的類。

程序的這些元素與UI沒有明確的連接。他們應該如何創建和初始化?這些是「適用範圍廣泛」的服務,不適合特定的ViewModel,也不會感覺像一個模型。

有沒有正確的方法來做到這一點?什麼應該「擁有」並創建這些對象? (視圖模型,或者說讓他們的靜態和創造自己呢?)

這裏是MVVM模式的示意圖,有一些調整,以展示我在尋找:(高亮文本和紫色框)

當服務器接收到「用戶已加入」消息時,該服務將向已訂閱該模型的模型發送一個事件,並通知該新用戶。 ViewModel會看到這個改變,並將用戶名添加到UI中。

http://i.imgur.com/Jo1mWDk.png

回答

2

您可以鏈接到一個UI的某些功能服務。 (例如,只有主窗口使用它們)還可以有許多窗口之間共享的服務。

對於第一種情況,我通常在我的ViewModels中實例化服務。
對於應用程序範圍的服務,我寧願在App.xaml.cs中創建實例,並將引用傳遞給我的viewmodel。

這裏是我的一個項目的例子。

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    ConnectionManager connMan = new ConnectionManager(); 
    MainViewModel mvm = new MainViewModel(connMan); 
    new MainWindow(mvm).ShowDialog(); 

    // TODO: save settings, etc. here 

    this.Shutdown(); 
} 

如果你的服務不依賴任何狀態信息,你也可以使用靜態類。例如,這就是我通常用於設置管理的東西。

編輯:爲您發佈的例子,你要問自己這樣一個問題:

誰負責建立和維護網絡管理器對象?

如果它是ViewModel,它可以將對象託管在它自己內部。如果它是由外部對象創建的,則可以將它傳遞給ViewModel。這兩種方法都有優點和缺點,我現在沒有足夠的信息來建議你們其中一個。

0

在這種情況下,儘量保持一個列表(例如ObservablleCollection<T>)在ViewModel,和專用模型數據類型一樣PersonUser的模型。

然後,創建單獨的名稱空間,如WorkersHelpersManagers,其是靜態類,只對他們的特定區域負責。例如:Workers/Sql/SqlWorker,Workers/Network/NetworkWorker

ViewModel的後面,在適當的命令中調用這些方法。

我認爲這將是一個簡單而先進的解決方案,因爲工作人員不會互相干擾(如果只通過抽象接口),除了他們不會連接到用戶界面。

1

您可以使用DI容器並使用它註冊您的服務。如果您使用依賴注入或使用DI容器作爲單純的服務定位器,那麼這是個人喜好的問題。

服務定位器的基本思想是知道如何獲得應用程序可能需要的所有服務。所以簡單地說ServiceLocator是一個單身註冊表。

依賴注入的基本思想是有一個單獨的對象,一個彙編程序,用適當的實現填充列表類中的字段。

一個很好的實現是Microsoft Unity Container。您可以將其用作DI容器或服務定位器。

相關問題