asp.net-mvc - 使用瘦 Controller 的 N 层域/ View 模型的最佳实践

标签 asp.net-mvc entity-framework viewmodel n-tier-architecture ef-database-first

我们希望将逻辑从超重的 Controller 转移到更完整的域中,以产生瘦 Controller 。

我们有一个关于如何构建域模型的问题,该域模型可以向 Controller 提供正确的信息,以便可以填充 View 模型。

我们的数据库优先解决方案具有以下层:

• UI(当前使用 MVC 的 Web 项目)

• 域

• 存储库

• 数据访问层 - Entity Framework

• 数据(指向 SQL Server 的数据库项目)

假设我们有多种 View ,需要针对特定​​实体具有不同数据量的 View 模型,例如

OrderBasic View 模型 - 仅 ID、标题和日期

OrderWithCustomer View 模型 - 以上内容加上客户实体中的客户姓名和电话号码

OrderWithLines View 模型 - OrderBasic 以及订单行及其信息的列表

• 等

我们的选择似乎是:

  1. 创建与这些类似的域模型。这似乎不对,因为域模型受到各个 View 的要求的影响,而且我们正在重复代码。

  2. 为每个实体创建一个域模型,其中包含可能需要的所有信息。这似乎对某些 View 的性能不利,填充并传输到客户端的信息比是需要的。

  3. 与 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/

相关文章:

c# - 我应该如何在 ViewModel 之间进行通信?

.net - 在 Blazor 和 MVC 中渲染 View

asp.net-mvc - 无法在 Entity Framework 模型中的 MVC 4 模板中使用 UserProfile?

.net - Entity Framework 使用 LEFT OUTER JOINS 生成错误的 SQL

entity-framework - 在 EF 4.3 中使用参数执行存储过程时,对象类型 System.Collections.Generic.List 不存在映射

WPF 绑定(bind) : Bind to parent of DataContext

html - Visual Studio 在调试时提取错误的 CSS 文件

asp.net-mvc - 尝试通过方法 ... HttpConfiguration ... 访问方法 ... DefaultFormatters ... 失败

javascript - 我正在使用ajax获取。 Controller 中的响应是正确的,但在ajax中返回404错误

asp.net-mvc - ASP.NET MVC - 母版页和 View 页的不同模型