2012-01-12 70 views
1

我有一些電子郵件模板,每個模板中都有一個頁眉和頁腳,它們共享相同的信息。我應該在我的視圖模型中繼承模型還是爲模型使用屬性

頁眉和頁腳被EmailModel.cs

public class EmailModel 
{ 
    public string CompanyName { get { return ConfigurationManager.AppSettings["CompanyName"]; } } 
    public string PhoneNumber { get { return ConfigurationManager.AppSettings["PhoneNumber"]; } } 
    public string FacebookUrl { get { return ConfigurationManager.AppSettings["FacebookUrl"]; } } 
    public string TwitterUrl { get { return ConfigurationManager.AppSettings["TwitterUrl"]; } } 
    public string YouTubeUrl { get { return ConfigurationManager.AppSettings["YouTubeUrl"]; } } 
    //Additional methods for sending these templates as emails 
} 

表示現在對於一個特定的電子郵件模板我有一個視圖模型。 NewSignUpEmailViewModel.cs

我應該這樣做:

public class NewSignUpEmailViewModel : EmailModel 
{ 
    public string FirstName { get; set; } 
    public string CompanyName { get; set; } 
    public string UserName { get; set; } 
    public Guid UserId { get; set; } 
} 

或本:

public class NewSignUpEmailViewModel 
{ 
    public EmailModel Email {get; set;} 
    public string FirstName { get; set; } 
    public string CompanyName { get; set; } 
    public string UserName { get; set; } 
    public Guid UserId { get; set; } 
} 

我只是用電子郵件作爲一個例子,是有優點/缺點每個?

我唯一能看到的是在某些情況下,你會遇到重複的屬性名稱問題。

+0

是的,您繼承時已經有CompanyName屬性衝突。我個人比較喜歡構圖而不是繼承。 2個CompanyName屬性是否代表相同的信息? – danludwig 2012-01-12 20:46:23

+0

基類中的CompanyName屬性代表我的公司,視圖模型中的CompanyName代表客戶端。我最終重命名了EmailModel中的屬性,其前綴爲「Our」。 – 2012-01-12 21:02:06

+0

[ASP.NET MVC體系結構:ViewModel的組合,繼承或重複?]的可能的重複?(http://stackoverflow.com/questions/6954102/asp-net-mvc-architecture-viewmodel-by-composition-inheritance-or - 複製) – nawfal 2015-01-12 20:24:22

回答

2

組合通常比繼承更受歡迎,但兩者都有自己的位置。一個很好的經驗法則是確定您的對象之間是否存在「是-a」或「具有-a」關係。如果對象1將對象2作爲組件,則組合絕對是一種方式。

舉個例子,讓我們不同的方法處理你的數據模型位:

public class SocialLinks 
{ 
    public string FacebookUrl { get; set; } 
    public string TwitterUrl { get; set; } 
    public string YouTubeUrl { get; set; } 
} 

public class User 
{ 
    public SocialLinks links { get; set; } 
    public string Name { get; set; } 
    // and so on 
} 

在這個例子中,很明顯,用戶有社交網絡的鏈接,而不是給用戶作爲SocialLinks的專用版本類。希望有所幫助!

+0

其實這確實很有意義。我想繼承將是像水果和蘋果。 – 2012-01-12 23:32:07

+0

很高興能幫到你! – 2012-01-13 00:08:44