【问题标题】:How to deal with complex queries in MVC?如何处理 MVC 中的复杂查询?
【发布时间】:2018-08-19 19:49:09
【问题描述】:

假设您有三个模型,OrganizationOrganizationUserUser

您需要处理以下请求:

  1. 当用户创建组织时,他们应该成为与该组织关联的用户(OrganizationUser 表中的一行)。

  2. 如果上述任何操作失败,则整个“流程”应该失败。这应该通过事务来实现。

以下是我认为构建它的三种最佳方式:

  • 在控制器中,创建 TXN,将其传递给 Organization 和 OrganizationUser 模型以创建各自的行。如果需要,回滚。控制器包含业务逻辑(用户付费、组织类型...等)。
  • 在控制器中,调用处理事务创建的CreateOrganizationService,将其从控制器中抽象出来;将其传递给模型。 CreateOrganizationService 是我们保留大部分业务逻辑的地方
  • 拥有Organization 模型需要OrganizationUser 模型并负责事务创建、业务逻辑和OrganizationUser 行的创建。

有没有更好的思考方式,或者我可以应用不同的方法/模式?

【问题讨论】:

    标签: api model-view-controller model transactions


    【解决方案1】:

    控制器的工作是将传入请求转换为传出响应。为此,控制器必须获取请求数据并将其传递到服务层。然后服务层返回数据,控制器注入到视图中进行渲染。

    MVC 中的模型不是一个类,而是一个层。

    模型的工作是表示问题域、维护状态并提供访问和改变应用程序状态的方法。模型层通常分为几个不同的层:

    服务层 - 该层为应用程序的相关部分提供内聚的高级逻辑。该层由 Controller 和 View 助手直接调用。

    数据访问层 -(例如Data Mapper)该层提供对持久层的访问。该层仅由 Service 对象调用。

    值对象/实体层 - 该层提供模型层次结构中“叶”节点的简单、面向数据的表示。

    对于您的问题:不要将业务逻辑或事务放入控制器中。将业务逻辑(和事务)放入Service 类(模型层的一部分)。

    Source

    【讨论】:

      【解决方案2】:

      您可以在控制器和存储库之间实现一个服务层,您可以在其中处理业务逻辑并使控制器干净。并且所有与数据库(CRUD)相关的操作都可以在存储库中完成。

      参考这个: Difference between Repository and Service Layer?

      【讨论】:

        【解决方案3】:

        从您的控制器,您可以调用:

        svc.CreateOrganization(<params>);
        

        我可能不会将模型传递给服务。我会将您应该调用的 CreateOrganization 调用中的每条数据 b/c 参数化的实际数据传递给应该使用 DAO 存储数据的数据访问层。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-23
          • 2018-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多