【问题标题】:Refactoring fat controllers and handling validation and logging in the service layer重构胖控制器并在服务层处理验证和日志记录
【发布时间】:2013-08-22 21:10:23
【问题描述】:

我目前有一个受胖控制器影响的应用程序。我正在尝试将业务逻辑提取到服务层中,并希望阐明我的方法。

为了引发模型错误,我计划使用如下所述的方法:http://www.asp.net/mvc/tutorials/older-versions/models-%28data%29/validating-with-a-service-layer-cs - 使用 IValidationDictionary 方法大约降低了 1/2。

但我发现新版本的文档中没有讨论这种方法。在较新的版本中,服务层部分中的验证已完全删除。

我希望对于以下问题/验证我的方法有足够的背景:

  1. 相信上面链接中的方法已经过时,不应该用于支持 DataAnnotations(并且可能覆盖 IsValid - 这可能很天真,我不完全理解验证 ModelState.IsValid)。我的理解是否正确,还是这些问题有些不同?
  2. 我希望对实体(在具有到实体的字段 1-1 映射的简单表单上)和 DTO(在具有不太简单映射到实体的表单上)的强类型视图进行混合。是否可以让实体验证冒泡到 DTO 以避免重复非业务需求验证?在没有 DTO 的情况下可以强类型化的实体上,我是否应该在实体上包含业务逻辑验证(这似乎是错误的)?我是否正确地考虑/处理了这一点?
  3. 该站点正在使用存储库方法 - 我可以跳过服务层并让我的业务逻辑分布在数据注释和存储库中吗?我又问对了问题吗?

【问题讨论】:

    标签: c# entity-framework asp.net-mvc-4 dto business-logic


    【解决方案1】:
    1. DataAnnotations 是当前 (MVC 4) 模型验证的最佳实践方法。就模型验证的工作流程而言,验证发生在模型绑定时,即 MVC 框架检查请求中的值并尝试绑定/水合/填充请求所针对的操作方法中列出的参数。

    2. 当使用带有 MVC 的服务层时,将 DTO 与 MVC 中的视图模型合并是非常自然和方便的。两者的目的是只封装将在两点之间传递的数据。所以我想说创建一个类用作 DTO 和视图模型,并用 DataAnnotations 标记其属性以进行模型验证。

    3. 这个问题有点主观,还取决于已部署应用程序的预期网络架构。如果您的目标是包含 Web、应用程序和数据库服务器的 3 层部署架构,则服务/应用程序层将是固有且必要的。话虽如此,如果未设置网络架构,则可能没有真正的理由拥有服务层,特别是如果不需要其他应用程序(无论是内部的还是外部的)来使用服务层中包含的逻辑。在模型验证和存储库中实现您的业务逻辑非常好。

    【讨论】:

    • 如果视图可以直接绑定到实体,我是否仍应创建 DTO 或视图模型来封装 EF 外部的业务逻辑验证?其次,是否普遍接受在 ViewModel 上复制我的 EF 注释以在模型绑定时对其进行验证?
    • 这是一个好问题,有其优点和缺点。一方面,由于视图与实体一对一映射,因此不需要视图模型,另一方面,一致性始终是一种很好的做法,因此它可能证明创建视图模型只是为了让您始终可以看到那里无论实体如何,都适用于业务规则。此外,如果您有一个服务层,那么无论如何您都需要 DTO。在任何一种情况下,您都应该只将注释放在一个位置以避免混淆,并且只有一种类型可以用作视图的模型并进行验证。
    猜你喜欢
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多