MVVM和分层,实现服务层

The*_*ude 6 architecture wpf mvvm

我正在构建一个MVVM应用程序.我正在尝试构建我的应用程序,如下所示:

在此输入图像描述

我不知道这种方法在MVVM中是否很常见.无论如何,ViewModel使用服务层来填充它正在包装的Model或ObservableCollection.为了利用它的服务,ViewModel有一个包含服务抽象的字段,如下所示:

IService service;
Run Code Online (Sandbox Code Playgroud)

因为我使用Linq查询数据库,所以我的实体名称与我的域名相同.为了让ViewModel不知道服务层/数据库实体,我需要服务层来返回域模型而不是Linq生成的数据库实体.我这样做是通过执行以下操作(我正在工作的一个例子):

ObservableCollection<ItemTypeViewModel> GetItemTypes()
{
   DataContextLocalDB dc = new DataContextLocalDB();
   ObservableCollection<ItemTypeViewModel> itemTypes = new ObservableCollection<ItemTypeViewModel>();

   foreach (ItemType itemType in dc.ItemTypes)
   {
      Models.ItemType type = new Models.ItemType();
      type.Name = itemType.Name;
      type.Description = itemType.Description;

      ItemTypeViewModel itemTypeViewModel = new ItemTypeViewModel(type);

      itemTypes.Add(itemTypeViewModel);
   }
}
Run Code Online (Sandbox Code Playgroud)

有几件事我不满/不确定:

  • 这是与MVVM结合构建的好方法吗?
  • 我被迫使用Models.ItemType使其与来自数据库的ItemType不同.这是不可避免的吗?
  • 我正在回馈一个ObservableCollection - 也许还有别的东西可以更好地回馈然后某个地方让我返回一个ObservableCollection?
  • 总的来说,有什么可以改进,或者你看到我做出的判断错误是什么?

谢谢 :-)

Ela*_*atz 2

没有理由重新创建 Linq 为您创建的数据对象。只需将它们传递给 ViewModel 就可以了。看起来您必须在域和 ViewModel 之间创建解耦,但由于这些实体只包含属性而不包含逻辑,因此可以传递它们,而且编程起来也会更容易。

其他一切都是最新的。唯一的一件事是我不会使用 LinqToSql,而是使用 EntityFramework。看起来差不多,只是L2SQL被MS放弃了。