如何处理MVC中的复杂查询?

时间:2018-03-11 19:38:46

标签: api model-view-controller model transactions

假设您有三个模型,OrganizationOrganizationUserUser

您需要处理以下要求:

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

  2. 如果上述任何操作失败,整个"流程"应该失败。这应该通过交易来实现。

  3. 以下是我认为你可以设计它的三种最佳方式:

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

    有没有更好的方法来考虑这个问题,或者我可以应用不同的方法/模式?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

值对象/实体层 - 此层提供简单的,面向数据的表示" leaf"模型层次结构中的节点。

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

Source

答案 1 :(得分:1)

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

参考: Difference between Repository and Service Layer?

答案 2 :(得分:0)

从您的控制器

,您可以致电:

VK_LMENU

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