我们希望将逻辑从超重的 Controller 转移到更完整的域中,以产生瘦 Controller 。
我们有一个关于如何构建域模型的问题,该域模型可以向 Controller 提供正确的信息,以便可以填充 View 模型。
我们的数据库优先解决方案具有以下层:
• UI(当前使用 MVC 的 Web 项目)
• 域
• 存储库
• 数据访问层 - Entity Framework
• 数据(指向 SQL Server 的数据库项目)
假设我们有多种 View ,需要针对特定实体具有不同数据量的 View 模型,例如
• OrderBasic View 模型 - 仅 ID、标题和日期
• OrderWithCustomer View 模型 - 以上内容加上客户实体中的客户姓名和电话号码
• OrderWithLines View 模型 - OrderBasic 以及订单行及其信息的列表
• 等
我们的选择似乎是:
创建与这些类似的域模型。这似乎不对,因为域模型受到各个 View 的要求的影响,而且我们正在重复代码。
为每个实体创建一个域模型,其中包含可能需要的所有信息。这似乎对某些 View 的性能不利,填充并传输到客户端的信息比是需要的。
与 2 相同,但具有仅填充必填字段的单独或参数化域方法。这可能会更高效,但意味着模型有时不完整。
还有更好的办法吗?最佳实践是什么?
谢谢
克里斯.
最佳答案
域模型是互连对象的图形,这些对象相互通信并执行您的业务需求并封装业务规则。还有封装业务工作流程和/或计算/算法的域服务。
当您对这些域对象进行建模时,除了您的业务及其规则之外,您不应该关心任何其他事情。不应该关心数据库或你的 View 是什么样子。
您的架构中还缺少封装应用程序用例的应用程序层
(您可以认为,如果更改应用程序,您也会更改用例).
应用层位于 UI(包括 MVC Controller )和域层之间,并编排实体和/或域服务以实现某些用例。
从应用程序层,您返回一些 DTO 对象(不是来自数据库本身的实体!),然后将该 DTO 中的信息转换为非常 UI 友好的 View 模型对象(以这样的方式转换它,您可以只需在 HTML 中进行简单的直接数据绑定(bind)即可)。
我在多个项目中实现了相同的架构(可能进行了一些小的调整),并且获得了良好的结果,包括仅包含模型状态验证的瘦 Controller 、对应用程序层的 1 次调用以及 DTO 和 View 模型之间的一些粘合代码.
这里有很多东西要讨论,并且方法可能会根据您自己的环境和非功能需求而有所不同,因此请始终鸟瞰您实际在做什么以及它是否对您的特定情况有意义.
附注您可以在这里找到一些很好的指南(记住依赖规则):http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html
关于asp.net-mvc - 使用瘦 Controller 的 N 层域/ View 模型的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24655024/