在ASP.NET MVC解决方案中从我的域对象重构表示代码的最佳方法是什么?

leo*_*ora 14 html c# asp.net-mvc refactoring domain-object

我刚刚接手了一个ASP.NET MVC项目,需要进行一些重构,但我希望得到一些关于最佳实践的想法/建议.

该站点有一个SQL Server后端,这里是对解决方案内项目的回顾:

  • DomainObjects(每个数据库表一个类)
  • DomainORM(将对象映射到数据库)
  • 模型(业务逻辑)
  • MVC(常规ASP.NET MVC web设置)----控制器---- ViewModels ---- Views ---- Scripts

我看到的第一个"问题"是,虽然Domain对象类几乎是POCO,并且在计算字段周围有一些额外的"get"属性,但Domain Objects中有一些表示代码.例如,在DomainObjects项目中,有一个Person对象,我在该类上看到了这个属性:

 public class Person
 {

    public virtual string NameIdHTML
    {
        get
        {
           return "<a href='/People/Detail/" + Id + "'>" + Name + "</a> (" + Id + ")";
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

显然,在域对象中使用HTML生成的内容似乎是错误的.

重构方法:

  1. 我的第一个本能是将它移动到MVC项目中的ViewModel类,但是我发现有很多视图符合这个代码,因此我不想在每个视图模型中复制代码.

  2. 第二个想法是创建PersonH​​TML类,它是:

    2A.在构造函数中接受Person的包装器

    2B.从Person继承并具有所有这些HTML呈现方法的类.

    视图Model会将任何Person对象转换为PersonH​​TML对象,并将其用于所有渲染代码.

我只是想看看:

  1. 如果这里有最好的做法,因为这似乎是一个常见的问题/模式

  2. 这个当前状态有多糟糕,因为除了感觉不对外,它并没有真正导致理解代码或创建任何不良依赖关系的任何重大问题.任何有助于描述为什么将代码保持在这种状态下的实际意义上的错误(与理论上的关注点分离相比)都会有所帮助,并且团队中是否存在争论是否值得改变.

Fra*_*ran 10

我喜欢TBD的评论.这是错误的,因为您将域关注与UI问题混合在一起.这会导致您可以避免的耦合.

至于你建议的解决方案,我真的不喜欢它们中的任何一个.

  1. 介绍视图模型.是的,我们应该使用视图模型,但我们不想用HTML代码污染它们.因此,使用视图的一个示例是,如果您有父对象,人物类型,并且您想要在屏幕上显示人物类型.您可以使用人员类型名称填充视图模型,而不是完整人员类型对象,因为您只需要屏幕上的人员类型名称.或者,如果您的域模型的名字和名字是分开的,但是您的视图调用了FullName,您将填充视图模型的FullName并将其返回到视图.

  2. PersonH​​tml类.我甚至不确定那会怎么做.视图代表ASP.NET MVC应用程序中的HTML.你有两个选择:

    一个.您可以为模型创建显示模板.这是一个Stack Overflow问题的链接,用于显示模板,如何在MVC 4项目中制作显示模板

    湾 您还可以编写一个HtmlHelper方法,为您生成正确的HTML.像@ Html.DisplayNameLink(...)之类的东西那些将是你最好的选择.以下是了解HtmlHelpers的链接https://download.microsoft.com/download/1/1/f/11f721aa-d749-4ed7-bb89-a681b68894e6/ASPNET_MVC_Tutorial_9_CS.pdf