2017-10-18 23 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