2017-10-18 24 views
1

我有一個用MVVM的實現編寫的WPF應用程序。 MVVM模式沒有額外的框架。EF類實體應保存在哪個類中?

來自EF db的實體首先被包裝在它們自己的視圖模型中,並且我有一個modelcontroller將它們從「窗口」視圖模型加載到它們的視圖模型中。實體視圖模型的

例子:

public class MainViewModel: ViewModels.ViewModelBase 
{ 
    private IModelController modelController = new ModelController(); 

    private List<PurchaseOrderViewModel> _poList; 
    public List<PurchaseOrderViewModel> POList 
    { 
     get 
     { 
      return _poList; 
     } 
     set 
     { 
      _poList = value; 
      OnPropertyChanged(); 
     } 
    } 

    // ... 
    // Other Properties 
    // ... 

    public MainViewModel() 
    { 
     POList = modelController.GetPurchaseOrders(); 
    } 
} 

ModelController的例子:

public class ModelController : IModelController 
{ 
    public List<PurchaseOrderViewModel> GetPurchaseOrders() 
    { 
     using (var model = new DBContext()) 
     { 
      return model.purchaseorders 
         .Select(new PurchaseOrderViewModel { /* assign properties */ }) 
         .ToList(); 
     } 
    } 
} 

我應該在哪裏保存該包裹的視圖模型的窗口視圖模型的

public class PurchaseOrderViewModel : ViewModels.ViewModelBase 
{ 
    private someType _prop; 
    public someType Prop 
    { 
     get 
     { 
      return _prop; 
     } 
     set 
     { 
      _prop = value; 
      OnPropertyChanged(); 
     } 
    } 

    // ... 
    // Other Properties 
    // ... 

    public PurchaseOrderViewModel() { 
     // default constructor for LINQ 
    } 
    public PurchaseOrderViewModel(purchaseorder entity) 
    { 
     // load values from entity in properties 
    } 
} 

例(PurchaseOrderViewModel)一旦用戶完成編輯?正如我所看到的,有兩種選擇:

  1. 在每個viewmodel中創建一個保存函數,該函數指向modelController,但這種感覺像是一種不恰當的方法。
  2. 創建於modelcontroller保存功能,並通過視圖模型作爲參數

這很可能是我失蹤的MVVM模式的東西,但請點我在正確的方向。謝謝!

編輯:我從所提供的信息中排除了視圖(MainView),但該視圖直接綁定到由MainViewModel公開的屬性。

+1

選項1最接近,不合適。但是你並沒有充分使用MVVM。您應該將虛擬機建立在視圖(用例)上,而不是模型上。 –

+0

如果我正確理解你在說什麼,那麼我想我已經這樣做了。我的MainView直接綁定到MainViewModel的屬性。我沒有包含這些信息,因爲我認爲這與問題無關。 – MichelMichels

+1

不,我的意思是ViewModels不應該太緊密地遵循Models類。他們的名字應該來自你設計的屏幕。 –

回答

2

首先,我很可能不會將它命名爲ModelController,因爲這有點讓人混淆,因此人們認爲您在說MVC。相反,如果你把它XXXXService(例如PurchaseOrdersService)更有意義,它不再感覺「不適當」由於具有VM代表實際的工作是什麼樣的IoC很多用戶做。另外,它使您的VM保持乾淨。


注意:通過「服務」我並不一定意味着你VM將直接調用WCF服務(也不應該知道)。服務只是代表客戶以抽象和封裝方式實現某些內容的一種手段。例子包括:

  1. 信息保存到數據庫
  2. 獲取當前日誌機制
  3. 他們甚至可以是外立面,由此他們創造一個WCF客戶端代理,並調用代表您的遠程服務,而你不必知道細節。

所以一個典型流程是:

命令>>查看代碼背後>>VM >>服務

我之所以包括後面的視圖的代碼是典型這是你的地方:

  1. 捕獲異常
  2. async/await爲asynchonous撥打你的VM和服務

現在,當你通過上下文fromt的VM回服務的出發點,對究竟你不過經過我看沒有任何規則理由將VM傳遞給服務,因爲它包含服務不關心的信息。

只需通過中號,你的VM應擺在首位有必然,繼續通過結合更新。

+0

在這種情況下,我使用實體框架作爲我的模型。這是否意味着當我的視圖模型的暴露屬性發生變化時,我需要不斷更新該特定實體,並在保存回數據庫時將此實體返回到服務層?如果這聽起來像一個愚蠢的問題,我的道歉。你知道我在哪裏可以找到這個實現的例子嗎? – MichelMichels

+0

@MichelMichels通常不會,如果其保存的datagrid在移動到下一行時發生更改。否則,如果其詳細視圖,當對** V **進行更改時,數據綁定會立即通知** VM **。你的**虛擬機**應該有一個'Modified'標記,當你的** V **中有一個** Save **按鈕時(如果有的話),當點擊時執行你的'Save'命令。或者,您可以攔截您的視圖關閉事件,並在之前檢查是否進行了更改,並詢問用戶是否希望保存。 – MickyD

+0

@MichelMichels至於一個例子,我應該給你足夠的繼續,但如果不是,只是谷歌_「WPF MVVM IoC服務」_ – MickyD