我有一个用 MVVM 实现编写的 WPF 应用程序。 MVVM 模式没有额外的框架。
我的 EF db 实体首先包装在他们自己的 View 模型中,我有一个模型 Controller 可以将它们从“窗口” View 模型加载到他们的 View 模型中。
实体 View 模型示例:
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
}
}
窗口 View 模型示例:
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();
}
}
模型 Controller 示例:
public class ModelController : IModelController
{
public List<PurchaseOrderViewModel> GetPurchaseOrders()
{
using (var model = new DBContext())
{
return model.purchaseorders
.Select(new PurchaseOrderViewModel { /* assign properties */ })
.ToList();
}
}
}
用户完成编辑后,我应该在哪里保存这个包装好的 View 模型(PurchaseOrderViewModel)?如我所见,有两种选择:
我很可能在 MVVM 模式中遗漏了一些东西,但请指出我正确的方向。谢谢!
编辑 :我从提供的信息中排除了 View (MainView),但该 View 直接绑定(bind)到 MainViewModel 公开的属性。
最佳答案
首先,我可能不会命名它 ModelController
因为这有点令人困惑,让人认为你在说 MVC。相反,如果你称它为 xxxx Service
(例如 PurchaseOrdersService
)它更有意义,并且不再感觉“不合适”,因为拥有 虚拟机 委托(delegate)实际工作是许多 IoC 用户所做的。此外,它还能保存您的 虚拟机 干净的。
注意 : 我所说的“服务”不一定是指您的虚拟机 将直接调用 WCF 服务(您也不应该)。服务只是代表客户以抽象和封装的方式实现某事的一种手段。示例包括:
所以一个典型的流程是:
命令 >> 查看 后面的代码 >> 虚拟机 >> 服务
我在后面包含 View 代码的原因是,通常这是您:
async/await
异步调用您的虚拟机 和服务现在,当您将来自 VM 的上下文传递回服务时,没有关于您传递的确切内容的规则,但是我认为没有理由传递 虚拟机 到服务,因为它包含服务不关心的信息。
只需通过 手机 你的虚拟机 应该首先绑定(bind)并通过绑定(bind)继续更新。
关于c# - 应将包装的 EF 实体保存在哪个类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46807071/