【问题标题】:Step wizard UI during using Microservices使用微服务期间的步骤向导 UI
【发布时间】:2017-07-20 15:34:59
【问题描述】:

我有一个包含customer 实体和user 实体的系统。

Customer是花钱的人。每个客户包含 1-N 个用户。客户有指向用户的链接。

User 不能没有客户。用户实体包含 CustomerId。

问题是我只能使用特定的 UI 来创建客户。客户创建过程包括 UI 中的两个步骤:

  • 填写客户信息:名字、姓氏、地址等
  • 第二步为客户创建用户。

主要思想是在第 2 步结束时创建客户和用户。如果我可以将这两个实体存储在同一个数据库中,那就很简单了。我可以在一次 ACID 交易中做到这一点。它将全部或全部保存。

不幸的是,我使用了微服务——客户和用户是不同的微服务,有自己的存储。而且这两个存储都不是数据库——存储没有事务选项。所以Customer实体使用存储1,User实体使用存储2。

我建议在第一步之后保存客户。然后在第二步之后保存用户。但是在第二个 UI 步骤中有一个取消按钮,它应该删除在整个过程中创建的所有用户和客户。建议被拒绝。 问题是,如果具有特定用户名的用户已经存在,我不应该保存客户,也不应该保存用户。

我的问题是:

  • 我有多少个 RootAgregate?一两个?
  • 将用户存储在与客户存储不同的存储中是否正确?
  • 在这种情况下,正确的做法是什么?

附:我不喜欢将用户保存在客户内部的想法。在更改用户的情况下,我需要与客户合作。另一个问题是我需要用户在整个系统中是唯一的,并且需要获取所有用户的列表。

附:我使用 Azure Service Fabric 和 Actors 模型。

【问题讨论】:

  • 好吧,如果你想要强一致性,看起来你的服务边界可能是错误的。否则,您只能希望最终保持一致。基本上,您应该有一些东西(例如流程管理器)来跟踪整个流程并消耗事件以从一种状态转换到另一种状态。

标签: c# architecture domain-driven-design actor azure-service-fabric


【解决方案1】:

我有多少个 RootAgregate?一两个?

  • 您有一个聚合根和一个实体。

将用户存储在不同的存储中是否正确? 客户存储?

  • 不,不是。因为每个聚合都应该有一个存储库。

查看Effective Aggregate Design by Vaughn Vernon 了解如何设计聚合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    相关资源
    最近更新 更多