【问题标题】:DDD and Microservices - data flow and structureDDD 和微服务 - 数据流和结构
【发布时间】:2022-01-13 10:18:06
【问题描述】:

我正在尝试创建一个简单的博客平台,同时了解有关 DDD 和微服务的更多信息,所以我想请教您在这方面的两个建议:

  1. 我在项目中假设的一个业务规则是,只有角色PublicistAdministrator 的用户才能创建帖子,但Publicist 创建的帖子必须先得到Administrator 的批准才能发布公开。据我了解,这是Posts.Domain 的一部分,因此在Post 聚合(同时也是实体)中,我将更改帖子的状态封装为SetPublishedStatusBy 之类的方法,该方法将User(请求者)数据作为参数并评估上述规则(+ 创建域事件)。但是现在我怀疑有关请求者的信息是否真的是Posts.Domain 的一部分。也许应该在不同的地方评估请求者,例如 Posts.API 或其他一些服务,然后在完成后调用 SetPublishedStatus 而不使用参数?
  2. 让我们坚持上面的内容。尽管有Posts 微服务,我还在开发独立的Users 微服务,负责存储用户并为Administrator 提供一些工具来管理它们。当用户想要发布新帖子时,正确的数据流是什么?我会通过以下方式来想象:
  • 客户端向网关发送 PublishPost 命令和 post ID
  • 网关通过 HTTP 请求对用户进行身份验证(可能通过带有 JWT 的 cookie 完成)
  • 网关向Posts微服务发送PublishPost命令
  • Posts微服务调用Users微服务从DB获取相关用户数据
  • Posts 微服务按 ID 从 DB 检索帖子
  • 所有业务规则都通过Posts.Domain 进行评估,状态更改为Public
  • 如果一切正常,Posts 微服务会更新数据库并通知网关发送Success HTTP 响应

【问题讨论】:

    标签: design-patterns architecture microservices domain-driven-design domain-model


    【解决方案1】:

    我的想法...

    对于 DDD,您最好在与领域专家讨论时从该领域的通用语言中获得指导。

    “SetPublishedStatusBy”一词可能不会出现在该讨论中。

    我认为该讨论最有可能的结果是:

    • 管理员并发布帖子
    • 公关人员可以提交一篇帖子,管理员必须批准才能发布。
    • 管理员可以批准由公关人员提交的提交的帖子,这将导致帖子被发布。李>
    • 管理员可以拒绝提交的帖子

    然后我的帖子聚合最终会看起来像:

    class Post
    {
        void Submit()
        {
            this.Status = Submitted;
        }
        void Publish()
        {
            this.Status = Published;
        }
        void Approve()
        {
            if (this.Status != Submitted) throw "This post is not pending approval.";
            this.Status = Published;
        }
        void Reject()
        {
            if (this.Status != Submitted) throw "This post is not pending approval.";
            this.Status = Rejected;
        }
    }
    

    创建帖子时,UI 将在您的 API 中调用 Publish 或 Submit,具体取决于上下文。然后 API 会检查当前用户是否可以执行请求的发布或提交。

    另外两个选项:

    1. 引入一个名为 PostRequest 的聚合,公关人员有权创建并且只有在管理员批准后才能创建帖子。
    2. 如果您希望规则更加动态,即用户只需点击“发布”,无论他们是公关人员还是管理员,然后结果是发布的帖子或提交的帖子,具体取决于当天的规则,那么你会想要在你的 API 和聚合之间有一个编排/传奇/任务层,它可以与用户服务交互来决定对 Posts 服务的第一次调用应该是“提交”还是“发布”。

    【讨论】:

    • 谢谢。到目前为止,我是一支单人军队,所以不幸的是,在我成为一名专家之前,我不能依赖领域专家 :-)
    • 所以我假设在进行更改之前检查正确角色的责任将转移到应用程序层(服务)并跟踪谁以及何时进行更改将属于基础设施层或工作单元,特别是,正确的?另外,您将如何处理更新帖子的内容?我认为我仍然需要将用户概念作为作者和编辑添加到域中,因为它们在概念上与从基础设施层进行跟踪不同(例如,即使管理员批准了帖子并将作为最后一个在数据库中进行更改的用户保留,他没有编辑内容)
    • 是的,我会在应用程序入口点(API)中实现授权,但是将当前用户等详细信息作为实体的属性传递给域和基础设施实现是完全正常的。
    猜你喜欢
    • 1970-01-01
    • 2021-01-01
    • 2020-10-06
    • 2018-08-12
    • 2021-05-17
    • 2018-06-24
    • 2019-10-08
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多