【问题标题】:MVC: DRY vs WET [closed]MVC:干与湿 [关闭]
【发布时间】:2013-10-07 03:09:21
【问题描述】:

有人告诉我,Asp.Net MVC 中的 DRY 原则非常重要。我还被告知,遵守这一点的一部分是尽可能不要在 ViewModel 中重复实体属性属性,例如 [Required] 和 [Display(Name="Shuttle Name")]。

我还被告知,数据、业务和表示层之间的分离很重要。所以我想知道为什么像 [Display] 这样的属性在我的 ProjectName.Entity 项目中的实体上。我喜欢数据层没有表现层存在的想法。我个人更喜欢在我的数据层中没有显示信息,并且没有直接映射到我的表示层中的控件的数据实体。

例如。使用包含私有 Shuttle 实体属性和任何需要显示或编辑的属性的公共属性的简单 ViewModel:

private readonly Shuttle shuttle;

public ShuttleViewModel() { this.shuttle = new Shuttle(); }

public ShuttleViewModel(Shuttle shuttle)
{
    this.shuttle = shuttle;
}

[Required]
[Display(Name = "Shuttle Name")]
public string ShuttleName
{
    get { return this.shuttle.Name; }
    set { shuttle.Name = value; } 
}        

我意识到这可能会重复 ViewModel 中已经存在于 Entity 类中的属性并手动映射数据,但根据经验,我发现它每次都有效。当一个复杂的实体被超级映射到一个 ViewModel 时,我还看到了一些非常不直观的异常。所以我希望得到一些关于 DRY 与 WET 的反馈。

【问题讨论】:

  • 为什么问题被搁置?我在这里寻求最佳实践!我在问 DRY 是否意味着尽可能将实体绑定到 ViewModel!

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 mapping


【解决方案1】:

我坚信您不应将数据实体与视图模型混合使用。

视图模型属性可能因您的数据实体而异,例如某些属性在特定视图模型中是必需的,但对于您的数据实体可能是可选的。

您应该使用 Automapper 之类的工具按照约定以编程方式映射您的属性(或者为奇数属性使用自定义映射器)

我不同意这会违反 DRY 原则,因为它们都提供不同的功能。

【讨论】:

  • 谢谢 Jun。我同样相信数据实体上的属性与 ViewModel 上的属性有不同的用途,但其他人经常告诉他们它们是相同的,并且重绑定ViewModel 的数据实体是应该完成的方式。
猜你喜欢
  • 2011-02-04
  • 2010-10-24
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2013-11-12
  • 2011-01-29
  • 2010-10-31
  • 2013-01-22
相关资源
最近更新 更多