【问题标题】:Handling Child Data with Microservices使用微服务处理子数据
【发布时间】:2019-10-03 19:03:24
【问题描述】:

我正在尝试找出在新项目中组织代码的最佳方式。我正在采用 .NET Core API 和 Angular UI 的微服务方法。

我需要理解以下示例:

我有一个父级实体 Invoices。我的数据库中有一个 Invoices 表,我正在 API 中构建一个 Invoices 服务来处理 CRUD。

每张发票都与 InvoiceDetails 具有一对多的关系,后者提供了有关发票的更深层次的信息。

我计划将 InvoiceDetails CRUD 保留在上面列出的同一 InvoicesService 中,因为在我的脑海中,这一切都归结为该服务。

这似乎很简单,但我在 UI 方面感到很困惑。当我创建发票时,我还需要创建 InvoiceDetails。我应该调用一次 API 来创建发票,然后在返回时再调用一次来创建 InvoiceDetails,还是应该在一次调用中处理所有这些?

有没有更好的方法让我思考这个问题?我正在尝试尽可能多地分离关注点,因此似乎应该有一个用于处理 CRUD 的发票 API 控制器和一个用于 InvoiceDetails 的单独控制器。

【问题讨论】:

    标签: angular rest .net-core architecture microservices


    【解决方案1】:

    我认为您的 API 应该有一个端点,用于创建包含 InvoiceDetails 对象列表的 Invoice。同时,还应该有可用的端点来在您的 API 中创建单个 InvoiceDetail 对象。在这种情况下考虑 Rest API,并且对单个 angular/react/vue,..etc 客户端应用程序的需求不是很紧。

    这将确保您的 API 具有灵活性,以防您需要 UI 来将额外的 InvoiceDetails 添加到现有 Invoice 或包含所有 InvoiceDetails 对象的新完整 Invoice 对象。

    您使用哪些端点应该由 UI 或任何其他客户端决定。例如,在 UI 中创建一个新的发票我会去创建带有 InvoiceDetails 列表的 Invoice 端点。将 InvoiceDetails 添加到现有 Invoice 我将使用端点来添加 InvoiceDetails 对象。

    这是一个更具体的案例评估,基于用户试图在 UI 中实现的目标。 UI 可以添加一个父级及其所有子级或将一个子级添加到现有父级。

    现在结束了如何通过 UI 使用 API(一次或多次调用)?

    在创建 Invoice 时,从 UI 调用多个 API 以添加一个和一个 InvoiceDetails 对象可能是 UI 和 API 之间的同步问题。假设您成功添加了 7/10,但没有成功添加其余 3,因为出现问题,那么您可能需要重试策略并保持成功或不显示在 UI 中的状态?性能呢?

    我建议在创建“发票”对象时使用 API 调用,该调用将成功或失败,并且更容易控制 UI 客户端和 API 之间的通信。

    【讨论】:

    • 如果我正在创建发票,但我还没有 InvoiceDetails 并且将在创建 Invoice 后创建它们,那该怎么办?我会从 CreateInvoiceService 内部引用 CreateInvoiceDetailsS​​ervice 吗?我正在尽量减少我的依赖。
    • 如果在创建 Invoice 时您的 InvoiceDetails 对象列表为空,那么您根本不调用 InvoiceDetailsS​​ervice。如果 InvoiceDetails 对象不为空,则将列表传递给 InvoiceDetailsS​​ervice 中的方法。该方法将负责添加它们。当让 InvoiceDetailsS​​ervice 处理他们的实体和 InvoiceService 处理他们的实体时,您正在最小化您的依赖关系并分离关注点。
    • @halterdev 有意义吗? :)
    【解决方案2】:

    从领域驱动设计的角度来看,这取决于您的业务领域中的实体/聚合是什么。目前,InvoiceDetails 听起来像是一个不需要自己标识的 Value 对象,这表明它不需要自己的 CRUD Web API。

    看待这个问题的一种方法是问自己让 InvoiceDetails 单独存在是否有意义。在不绑定任何发票的情况下创建 InvoiceDetails 是否有意义?如果是,那么最好有一个单独的 API 端点来管理 InvoiceDetails 资源。如果不是,那么为 InvoiceDetails 创建另一个端点的理由是什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-07
      • 2019-12-03
      • 2016-05-22
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 2020-05-28
      相关资源
      最近更新 更多