MVVM和分层,实现服务层

时间:2011-04-03 08:14:59

标签: wpf architecture mvvm

我正在构建一个MVVM应用程序。我正在尝试构建我的应用程序:

enter image description here

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

IService service;

因为我使用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);
   }
}

有几件事我不高兴/不确定:

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

谢谢: - )

2 个答案:

答案 0 :(得分:2)

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

其他一切都非常新潮。唯一的事情是我不会使用LinqToSql,而是使用EntityFramework。看起来相同,只有L2SQL才是MS放弃的东西。

答案 1 :(得分:0)

public partial class ItemType : EntityObject //this is your Entity Model
{
   public string Name{get;set;}
   public string Description{get;set;}
}

您无法修改上述部分。

如果要通过viewModel扩展模型。创建另一个类

public partial class ItemType : EntityObject // this is your ViewModel class,this place on another file 
{// Important: in same namespace

   public void SomeMethod(){}
   public ICommand CustomCommand {get{...}}
   public string CustomProperty{
      get{ return localVar;}
      set{ localVar=value;
           onPropertyChanged("CustomProperty");
          }}
}

最后:

public IQueryable<ItemType> GetItemTypes{
   get{
    DataContextLocalDB dc = new DataContextLocalDB(); 
    return dc.ItemTypes;
   }
}