2011-06-16 158 views
9

我的ASP.NET MVC站點連接到WCF服務以獲取數據。 WCF服務返回這樣的數據合同:ASP.NET MVC視圖模型最佳實踐

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public string First { get; set; } 

    [DataMember] 
    public string Last { get; set; } 
} 

在我的MVC項目視圖模型看起來是這樣的:

public class MyViewModel 
{ 
    public string SomeExtraField1 { get; set; } 
    public string SomeExtraField2 { get; set; } 
    public string SomeExtraField3 { get; set; } 

    public Person Person { set; set; } 
} 

使我的視圖模型被引用返回的「人」的數據合同從數據服務?還是應該在我的MVC項目中創建一個新的「Person」類,以反映「Person」數據合同中的屬性?

WCF服務調用隱藏在接口後面。它似乎是有數據合同的接口引用使得我的接口是一個漏洞抽象。然而,我有一些人相信在我的MVC項目中創建一個額外的「Person」類,以反映數據合同是代碼膨脹。

圍繞這種分層/解耦的最佳實踐是什麼?

回答

17

如果我的視圖模型爲參考被從數據服務返回的「人」的數據合同?

不,避免這種情況,它給開發人員造成他們使用視圖模型的錯誤印象。在進行代碼評論時,我經常看到類似這樣的代碼:

public class MyViewModel 
{ 
    public SomeDomainModel1 Model1 { get; set; } 
    public SomeDomainModel2 Model2 { get; set; } 
    ... 
} 

這就是錯誤。當我批評他們不使用視圖模型時,他們告訴我:「Darin,看,我正在使用視圖模型」,不幸的是,這不是視圖模型應該如何工作。它們不是域模型的包裝。

或者我應該說反映了「人」的數據合同的性質我的MVC項目中創建一個新的「人」類?

是的,你可以創建一個PersonViewModel並且只包含你的視圖當然需要的屬性。

,或特定的視圖你設計這個視圖模型僅需要一些屬性,你也可以使它看起來像這樣:

public class MyViewModel 
{ 
    public string SomeExtraField1 { get; set; } 
    public string SomeExtraField2 { get; set; } 
    public string SomeExtraField3 { get; set; } 

    // this would be for example the concatenation of your domain model 
    // first name and last name as that's what this particular view needs to 
    // display 
    public string PersonFullName { set; set; } 
} 

至於你的域模型和視圖模型之間的轉換關注,AutoMapper簡單地說:優秀。

+0

可以通過構造函數將域對象傳遞給視圖模型並私自使用他的域對象嗎? – Fixer 2012-02-18 10:18:06

+0

@Fixer,不,默認的模型聯編程序會窒息而死。 – 2012-02-18 10:19:36

+0

@Darin,引入AutoMapper的+1 – CjCoax 2012-02-21 12:41:07

3

我想說創建一個Mapper層,它將在WCF Person類和「鏡像」Person類之間進行轉換。這樣你就可以將MVC實現綁定到POCO,而不是直接綁定到WCF。這增加了將WCF與另一個服務交換出去的能力,如果需要的話可以在未來觸摸MyViewModel(鬆散耦合)。