2011-04-03 114 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