【问题标题】:Should I inherit models in my view model or use a property for the model我应该在我的视图模型中继承模型还是使用模型的属性
【发布时间】:2012-02-09 03:19:17
【问题描述】:

我有一些电子邮件模板,在每个模板中我都有一个页眉和页脚,它们都共享相同的信息。

页眉和页脚用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; }
}

我只是以电子邮件为例,各有优缺点吗?

我能看到的唯一问题是,在某些情况下,您会遇到重复的属性名称问题。

【问题讨论】:

  • 是的,您在继承时已经发生了 CompanyName 属性冲突。我个人更喜欢组合而不是继承。 2 个 CompanyName 属性是否代表相同的信息?
  • 基类中的 CompanyName 属性代表我的公司,视图模型中的 CompanyName 代表一个客户。我最终用前缀“Our”重命名了 EmailModel 中的属性。
  • @nawfal 这个问题已有 3 年历史,答案已被接受,您现在投票结束了吗?找一个生活伙伴。
  • 我不确定 SO 是否有这样的重复政策。无论年龄大小,我总是看到重复的问题被关闭。没有什么私人的,只是尽我所能,让这里变得更好。

标签: asp.net-mvc-3


【解决方案1】:

组合通常比继承更受欢迎,但两者都有自己的位置。一个好的经验法则是确定对象之间是否存在“is-a”或“has-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 类的特殊版本。希望对您有所帮助!

【讨论】:

  • 其实这很有意义。我猜继承会是针对 Fruit 和 Apple 之类的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 2012-11-07
  • 1970-01-01
  • 2013-01-19
相关资源
最近更新 更多