MVC 中用于相似/继承对象的 DRY 主体与轻/薄视图

Posted

技术标签:

【中文标题】MVC 中用于相似/继承对象的 DRY 主体与轻/薄视图【英文标题】:DRY principals vs. light/thin views in MVC for similar/inherited objects 【发布时间】:2012-03-19 23:49:44 【问题描述】:

我有一系列继承的对象,它们都非常相似,只有几个字段在类之间有所不同。在这个类层次结构的基础上是一个抽象类,它包含所有后续对象应该具有的许多字段。像这样的:

abstractBase
  obj1 : abstractBase
    obj2 : obj1
      obj3 : obj2

显示这些对象的视图对于所有对象来说基本上是相同的,我只是引入了新的 div 来显示不同的数据。由于我对 MVC 相当陌生,因此我只有两个主要选择:

一种方法是为每个具体对象创建强类型视图。每个视图都非常相似,但底层对象略有不同。在我看来,这违反了 DRY 原则,因为每个视图的 90% 或更多内容将在下一个视图中重复。但从好的方面来说,这些观点没有任何重要的逻辑。

另一种方法是将视图绑定到基本抽象类,然后对继承的类进行检查以确定是否需要渲染某些内容。类似:

if (Model.baseObject is obj3) render out the special fields 

从好的方面来说,我不会违反 DRY 原则,我认为这是一件好事。但不利的一面是,视图将包含逻辑。据我了解,这或多或少是不赞成的。

有人遇到过类似情况吗? 您采取了什么方法? 还有其他我没有看到/不知道的选项吗?

现在我倾向于*更重的视图和更少的冗余代码。看起来好多了。

谢谢

【问题讨论】:

【参考方案1】:

我同意How much logic is allowed in ASP.NET MVC views?的选择答案

从本质上讲,视图旨在用作显示模型数据的结构。因此,如果它为显示特定模型而创建的结构可以根据模型中包含的数据进行调整,那么视图就达到了它的目的。根据要渲染的模型的某些属性有条件地在视图中显示元素是一种可接受的做法。

如果您的视图包含以任何方式修改模型数据的逻辑,这将违反 MVC 旨在建立的关注点分离。

【讨论】:

感谢 mhornfeck。我正在寻找错误的术语。那个帖子很棒。 +1 Shyju,我仍在反对强类型视图,我只是在调整我正在“绑定”的内容。但是现在我想想你在说什么......部分视图继承了它们根据插入的视图绑定的内容。所以它们也可能符合我的需要。我仍然看到的唯一缺点是多个视图 = 控制器中的多个动作事件 = 更多重复的代码。 + 1 我仍然有点心烦意乱,因为我正在做的事情可能过于复杂......但会减少重复......【参考方案2】:

我认为您应该遵循具有强类型视图的第一种方法。您可以拥有特定于这些视图的 ViewModel,然后绑定到该视图。如果您觉得另一个 View 中存在 ViewModel 的可重用性,请使用 PartialViews。

【讨论】:

以上是关于MVC 中用于相似/继承对象的 DRY 主体与轻/薄视图的主要内容,如果未能解决你的问题,请参考以下文章

MVC 验证 - 使用服务层保持 DRY - 最佳实践是啥?

设计模式:面向对象的设计原则下(ISP、DIP、KISS、DRY、LOD)

Django 表单:为继承模型组织创建/更新表单的最 DRY 方式

在不违反 SRP、OCP、DRY 的情况下编写测试

java 编程思想笔记——多态

mvc使用啥设计模式