2011-04-03 109 views
6

我正在构建一个MVVM应用程序。我试图构建我的应用程序是这样的:MVVM和分层,实现服务层

enter image description here

我不知道这种方法在MVVM是常见的。无论如何,ViewModel使用服务层来填充它正在包装的Model或ObservableCollection。为了让使用其服务的,视图模型具有保持服务的抽象,像这样一个领域:

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

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

其他一切都非常流行。唯一的一点是我不会使用LinqToSql,而是使用EntityFramework。看起来相当相似,只有L2SQL是MS放弃的东西。

+0

是啊,我知道了L2SQL。关于实体和域模型,你是否说我可以放弃拥有域模型?在很多关于MVVM的例子中,我看到人们有一个他们返回的模型,像这样:'foreach(this.db.Person中的Person人){this.persons.Add(new PersonViewModel(person));',其中Person是一个领域模型,而不是一个实体。人域模型就像他们说的贫血一样。为什么会有一个域模型,如果它们与实体相同? – TheDude 2011-04-03 09:39:17

+0

这正是我所说的。至于为什么他们不需要复制对象 - 问问他们! ;) – 2011-04-03 11:59:45

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; 
    } 
} 
+0

感谢您的回答! – TheDude 2011-04-03 18:09:44

+0

呃,不...你为什么要创建部分类?这不是MVVM。 ViewModels应该是将模型实例作为构造函数参数的包装器。 – Heliac 2013-11-08 07:22:22