我刚刚接手了一个 ASP.NET MVC 项目,需要进行一些重构,但我想获得一些关于最佳实践的想法/建议。
该站点有一个 SQL Server 后端,这里是对解决方案中项目的回顾:
- DomainObjects(每个数据库表一个类)
- DomainORM(将代码从对象映射到数据库)
- 模型(业务逻辑)
- MVC(常规 ASP.NET MVC 网络设置) ---- Controller ---- View 模型 ---- 意见 ---- 脚本
我看到的第一个“问题”是虽然域对象类几乎是 POCO在计算字段周围有一些额外的“获取”属性,域对象中有一些表示代码。例如,在 DomainObjects 项目中,有一个 Person 对象,我在该类上看到了这个属性:
public class Person
{
public virtual string NameIdHTML
{
get
{
return "<a href='/People/Detail/" + Id + "'>" + Name + "</a> (" + Id + ")";
}
}
}
很明显,在域对象中包含 HTML 生成的内容似乎是错误的。
重构方法:
我的第一直觉是将其移至 MVC 项目中的 ViewModel 类,但我发现有很多 View 都涉及此代码,因此我不想在每个 View 模型中重复代码。
第二个想法是创建 PersonHTML 类:
2a。在构造函数中接受 Person 的包装器或
2b。一个继承自 Person 的类,然后具有所有这些 HTML 呈现方法。
View 模型会将任何 Person 对象转换为 PersonHTML 对象,并将其用于所有呈现代码。
我只是想看看:
如果这里有最佳实践,因为这似乎是出现的常见问题/模式
当前状态有多糟糕,因为除了感觉不对之外,它并没有真正导致理解代码或创建任何不良依赖项的任何重大问题。从真正的实际意义(相对于理论上的关注点分离论点)来帮助描述为什么将代码留在这种状态是不好的任何论点都会有所帮助,而且团队中也存在是否值得改变的争论。
最佳答案
我喜欢 TBD 的评论。这是错误的,因为您将域问题与 UI 问题混合在一起。这会导致您可以避免的耦合。
至于您建议的解决方案,我不太喜欢。
引入 View 模型。是的,我们应该使用 View 模型,但是我们 不想用 HTML 代码污染它们。所以使用一个例子 View 将是如果你有一个父对象,人类型,并且你 想在屏幕上显示人物类型。你会填满 View 具有人物类型名称的模型,而不是完整的人物类型对象 因为你只需要屏幕上的人名。或者如果 您的域模型的名字和姓氏分开,但是您的 View 调用 FullName,您将填充 View 模型的 FullName 和 将其返回到 View 。
PersonHtml 类。我什至不确定那会做什么。 View 代表 ASP.NET MVC 应用程序中的 HTML。您在这里有两个选择:
一个。您可以为您的模型创建一个显示模板。这是用于显示模板的 Stack Overflow 问题的链接, How to make display template in MVC 4 project
您还可以编写一个 HtmlHelper 方法来为您生成正确的 HTML。像 @Html.DisplayNameLink(...) 这样的东西是你最好的选择。这是了解 HtmlHelpers 的链接 https://download.microsoft.com/download/1/1/f/11f721aa-d749-4ed7-bb89-a681b68894e6/ASPNET_MVC_Tutorial_9_CS.pdf
关于c# - 在 ASP.NET MVC 解决方案中从我的域对象重构表示代码的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41677383/