gpt4 book ai didi

asp.net-mvc - 将胖 Controller 管理到业务服务层的一些 Asp.NET MVC2 最佳实践

转载 作者:行者123 更新时间:2023-12-04 14:52:12 24 4
gpt4 key购买 nike

我的 Controller 变得越来越大而且无法控制。

典型的 Controller 执行以下操作:

  • 它确定给定用户是否有权访问给定资源。
  • 它验证 ViewModel。
  • 它将 ViewModel 转换为 DTOModel 以进行持久化。
  • 它调用存储库来更新/创建新对象和关联的其他新对象。
  • 它访问多个存储库助手类中的数据
  • 它检查用户是否得到通知。
  • 它调用助手发送电子邮件
  • 它通过其他存储库对象将数据记录到数据库
  • 等等...

  • 简而言之,他们策划了很多事情。我想把所有东西都移到一个服务层,但在我喜欢的代码示例中还没有真正看到任何实现的模式。我查看了一些开源项目,如 KiGG、Oxite、codecampserver 等……但它们都没有真正解决缩小我的 Controller 的问题。我想避免传递很多 HTTPContext 的东西,但这也许是不可能的。

    还有其他一些项目,我可以查看的最佳实践吗?我正在构建一个大型工作流/数据输入应用程序。

    感谢您提供一些链接和建议

    最佳答案

    我不知道有什么真实的例子可以炫耀我的头顶,因为我想我想出了我的 MVC 应用程序的 Controller -> 服务 -> 存储库分层方案基于我通过浏览 SO 找到的随机问题和答案。

    但是,我可以为您提供一个示例,说明如何将您列出的项目符号组织成适合我构建服务层的方式。这可能不是最好的方法,但这就是我做我的大型 mvc 应用程序的方式。这应该让您了解如何在您自己的应用程序中构建它

    我的服务层为每个业务单元组合了一个服务类。因此,如果我的应用程序有项目,并且每个项目都有一个人,我将有一个 ProjectService 类和一个 PersonService 类。

    根据您对 Controller 工作方式的描述,我的 Controller 的操作按以下方式工作。

    1) 获取当前用户信息,调用相应服务类的授权方法。因此,如果用户试图修改项目的详细信息,我会将用户 ID 和项目 ID 传递给 ProjectService 的 AuthorizeUser 方法。这意味着如果我更改为项目授权用户的方式,我只需要更改授权方法而不是每个 Controller 。

    2)在服务层创建、保存和销毁Viewmodels。服务层获取 View 模型,对其进行验证(如果失败则引发异常或验证结果),然后将其转换为数据对象,然后将其传递给存储库进行保存。它还从存储库请求数据对象,将其转换为 View 模型并将其返回给 Controller 。

    3) 所有 Action 的日志记录都发生在服务层。这可以根据所呈现的操作(尝试将对象保存到数据库)自动执行,或者您的 Controller 可以显式调用服务层来记录操作。

    这样做的全部目的是将通用功能整合到一个易于维护的层中。如果您更改 View 模型转换为 DTO 的方式,则很容易知道在哪里进行更改并进行一次更改。如果您需要更改日志记录、用户访问权限,或者即使您想更改从存储库中检索某些数据的方式,这是一个简单的更改区域,而不必查找所有 Controller 并直接修改它们。

    编辑:这使 Controller 很小,因为它们实际上只包含对服务层的一些调用,仅此而已(授权、执行操作、显示 View )。结束编辑

    最后,asp.net 网站有一个在服务层中执行验证的教程。可以找到该教程here .

    关于asp.net-mvc - 将胖 Controller 管理到业务服务层的一些 Asp.NET MVC2 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3451913/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com