导入数据和事件溯源

2024-04-04

我目前正在开发一个整体系统,我希望将其引入现代并结合 DDD 和 CQRS。我收到了重新编写解决方案的导入机制的请求,并认为这可能是开始此重新架构过程的好机会。

目前流程是:

  1. 用户上传 CSV
  2. 系统解析 CSV 并在屏幕上显示每一行。对每一行以及与每一行相关的错误/警告进行验证
  3. 用户可以修改每一行并重新验证所有行
  4. 然后,用户选择没有错误的行并提交导入
  5. 行导入,任何未选定的行或有错误的行都会进入保留区域,以便他们可以在以后处理它们

额外的细节是多行可以属于同一实体(例如,2 行可以是订单中的行项目,因此将具有相同的订单参考)。

我正在考虑有一个导入传奇,它会生成一堆导入聚合(例如 OrderImportAggregate),然后当提交导入时,这些聚合将被转换为当前在系统中使用的类,这有望成为其本身的聚合当进一步重新架构时!因此,传奇过程将采取以下方式:

  1. [EntityType]FileImportUploaded - 存储 CSV
  2. [EntityType]FileImportParsed - 生成 n 个 [EntityType]Import 聚合。[EntityType]ImportItemCreated 引发/处理的事件
  3. 流程将调用当前实体所经历的验证例程来生成错误列表(如果有),并针对每个项目进行存储。 [EntityType]ImportItemValidated 事件引发/处理
  4. 每次在屏幕上更改一行时,它都会调用 saga 和项目 id 的 Web API 方法来更新详细信息并按照第 3 点重新验证该行。
  5. User submits import, service groups entities together, based on ref for example, they get converted into the current system entity and calls their import/save routine. [EntityType]ImportItemCompleted event raised.
    1. 当所有聚合都处于 ImportItemComplete 状态时,Saga 完成

由于这是我第一次实现 CQRS/Event Sourcing/DDD,因此我想从正确的基础开始,所以想知道这是否是该功能所需的方法?


我建议您将域分成两个单独的子域,分别实现为单独的有界上下文,其中一个有界上下文是Import bounded context (ImportBC),另一个是receiving bounded context (ReceivingBC,实际名称我不知道,请相应替换)。

然后,在Import BC你应该使用CRUD风格,每个导入文件都有一个实体,并使用持久性remember验证和导入过程的进度(该实体包含尚未导入的项目的列表)。每个项目经过人工验证后,可以将命令发送到ReceivindBC根据业务规则测试聚合是否有效,但无需将更改提交到存储库!这样做是为了让人类用户知道该项目是否确实有效并启用/禁用import button。通过这种方式,您就不会在两个有界上下文中重复验证逻辑。当用户实际按下import button将导入命令发送到聚合中ReceivingBC并且您实际上将更改提交到存储库。此外,您还可以从import file CRUD entity.

这种发送命令但实际上不持久保存到存储库中的技术对于帮助用户体验 in the UI(不重复内部逻辑UI),如果你遵循DDD最佳实践并将您的聚合设计为纯粹的、无副作用的对象(与存储库无关,不知道它们的存在,根本不使用它们!)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

导入数据和事件溯源 的相关文章

  • CQRS - 如何对场景执行系统进行建模

    我最近开始为我即将启动的一个绿地项目研究 CQRS 和 DDD 我研究了 Udi Dahan Greg Young Mark Nijhof 等人的大量资料 这些确实非常有帮助 我想我对这些概念有了很好的理解 但是 我仍然有一些关于如何将这些
  • 领域驱动设计中的 WCF 序列化和值对象模式

    Eric Evans 所著的 领域驱动设计 一书描述了称为值对象的模式 值对象的重要特征之一是它是不可变的 作为一个例子 我有一个值对象 Clinic 其中must有名字和id 为了使其成为值对象 我不提供名称和 ID 的设置器 另外 为了
  • 领域驱动设计和安全

    这与此相关question https stackoverflow com questions 3006808 security implementation in domain driven design这似乎是不久前问过的 项目中的安全
  • 具有行为和 ORM 的丰富域模型

    观看 Jimmy Bogard 的 NDC12 演示 Crafting Wicked Domain Models 后 http ndcoslo oktaset com Agenda http ndcoslo oktaset com Agen
  • 如何定义分层数据结构的DDD聚合根?

    我目前正在尝试将领域驱动设计原则应用于我的开发实践 我一直致力于如何为按层次结构组织的数据定义聚合根 我们以文件夹结构为例 每个文件夹可以有 0 N 个子文件夹 子文件夹 0 N 也可以有 0 N 个子文件夹 依此类推 我对文件夹及其所有直
  • 如何在领域层使用工作单元

    我正在尝试在 我的服务 类中使用工作单元模式 我有我的 CompanyService 课程 public class CompanyService ICompanyService private readonly ICompanyRepos
  • CQRS 对于我的域是否正确?

    我正在对一个档案进行建模 它是视频点播系统的一部分 将存档想象成 Windows 资源管理器 其中多个用户可以创建文件夹 上传视频 重组文件夹等 有业务规则 权限 确定是否允许用户执行任务 即重命名文件夹 移动文件夹 查看文件夹等 我已将每
  • 实现领域驱动设计的函数式方法

    我在使用 C 编写领域驱动应用程序方面拥有丰富的经验 我编写的应用程序越多 我就越发现我想要采用一种不太适合标准 C OO 技术的方法 我想编写尽可能多的纯函数 因为它们真的很容易测试 我想以更具声明性的方式编写我的业务逻辑 所以我一直在研
  • 首先是 DDD 数据库。如何处理聚合

    我正在尝试学习 DDD 的概念 我做了一个项目 我使用数据库优先方法 在基础设施中 我添加了一个 edmx 文件 我选择自动生成实体 现在在 域 中我正在尝试创建聚合 但在这里我遇到了一些问题 我正在尝试创建一个名为 User 的聚合 但
  • 涵盖 .NET 中的 TDD、DDD 和设计模式的书籍

    我想要一本能够真正让我全面了解使用 C TDD ASP NET MVC DDD 和设计模式 例如存储库模式 的现代 ASP NET 开发的书 我非常擅长 C 和 ASP NET MVC 但想填补空白 如果您对涵盖这些主题的一两本书有很好的体
  • 有丰富的领域模型示例吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个简单的示例来说明使用富域模型的好处 理想情况下 我想要一个之前和之后的代码列表 应该尽可能
  • 事件溯源:在重放事件并监听新传入事件时避免项目重复事件

    在需要构建新视图的场景中 我们可以重播来自活动商店 结果 我们将投影出新的视图 因此 我们的想法是部署一个新的投影 该投影可以投影所有旧事件 通过重播 并监听新传入的事件并投影它们 我认为在读取旧事件和收听新传入事件时可能会发生比赛条件 因
  • 领域驱动设计:处理原子操作和事务

    必须保证每个聚合内部的一致性 在存储库中执行此操作很容易 因为我始终可以使用数据库或框架中的事务 我对存储库之外发生的事情表示怀疑 一项服务可能需要使用多个聚合来处理请求 在服务处理过程中或在保留聚合时可能会出现问题 如果服务处理过程中出现
  • 领域模型可以知道存储库吗?

    可能对于某些域逻辑实现实体需要访问存储库以更新 删除自身或任何相关实体 这听起来对吗 不 不是 至少对于标有 的问题 领域驱动设计 标签 当然 Active Record 模式有权在某些系统中生存 并且有些人发现强耦合很有用 但在 DDD
  • DDD:持久聚合

    让我们考虑一下典型的Order and 订单项目例子 假如说订单项目是的一部分Order聚合 只能通过订单添加 所以 要添加一个新的订单项目 to an Order 我们必须通过存储库加载整个聚合 将新项目添加到Order对象并再次保留整个
  • 处理聚合的所有事件

    请参阅下面我的第一个持久订阅 namespace PersistentSubscription internal class Program private static void Main var subscription new Per
  • 定时任务应该放在哪一层?

    我正在尝试使用分层架构来实现 DDD 应用程序 我有 基础设施层 实现应用程序的技术特定部分的层 领域层 包含领域模型的层 应用层 包含与领域模型交互的干扰的层 接口层 从外部接收事件的层 经典的 3 层 基础设施 架构非常清晰 但我的应用
  • 缺失的事件如何重播?

    我正在尝试了解有关 CQRS 和事件溯源 事件存储 的更多信息 我的理解是 在这种情况下通常不使用消息队列 总线 消息总线可用于促进微服务之间的通信 但它通常不专门用于 CQRS 然而 我目前的看法是 消息总线将非常有用 可以保证读取模型最
  • 使用 CQRS 处理中介管道中的错误/异常?

    我正在努力追随这个帖子 https lostechies com jimmybogard 2014 09 09 tackling cross cutting concerns with a mediator pipeline 由 Jimmy
  • Axon 框架的现实生活体验[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 作为研究用于项目的 CQRS 的一部分 我遇到了轴突框架 http www axonframework org 我想知道是否有人有任何现实生活经

随机推荐

  • 分层架构中的实体框架

    我正在使用实体框架的分层架构 这是我到目前为止想到的 除 UI 之外的所有项目都是类库 Entities POCO 实体 完全的执着无知 没有参考其他项目 由 Microsoft 的 ADO Net POCO 实体生成器生成 DAL 带有上
  • 具有复杂 Json 结构的 Room

    我是 Room 的新手 目前正在做我的一个项目 我应该在其中插入一些改造的 GSON 数据 首先 让我在下面展示我的 JSON 它将提供清晰的结构 organization id 0 title string description HTM
  • 计算唯一对的数量并将计数存储在矩阵中

    我的问题类似于stackoverflow com q 7549410 https stackoverflow com q 7549410 我有配对数据 如下所示 ID ATTR 3 10 1 20 1 20 4 30 我想计算唯一对的数量并
  • Python 3 CSV 文件在打印时出现 UnicodeDecodeError: 'utf-8' 编解码器无法解码字节错误

    我在 Python 3 中有以下代码 用于打印 csv 文件中的每一行 import csv with open my file csv r newline as csvfile lines csv reader csvfile delim
  • 更改文件长度时,是否需要重新映射所有关联的 MappedByteBuffer?

    我有一个小而简单的存储系统 可以通过内存映射文件进行访问 由于我需要处理超过 2GB 的空间 因此我需要一个具有固定大小 如 2GB 的 MappedByteBuffer 列表 由于不同原因 我使用的空间较少 那么一切都相对简单 一个缓冲区
  • Nuxt 3 中的深色模式切换器无法与官方 @nuxtjs/color-mode 配合使用

    我想使用 tailwind 和推荐的 nuxtjs color mdoe 模块在我的 Nuxt 应用程序上实现深色模式 测试顺风的黑暗 类运行良好并且按预期工作 但是我无法使按钮切换器以编程方式设置颜色模式 我在 devDeps 中安装了
  • 将 props 传递给包装在 withRouter() 函数中的 React 组件

    我正在使用 React Router v4 在我的 React 应用程序中导航 下面是包裹在withRouter 函数使其能够在单击时更改路线 const LogoName withRouter history props gt h1 gt
  • 如何使用perl脚本删除重复行

    如何删除重复行 我当前的代码 use strict use warnings my input input txt my output output txt my seen open OP gt output or die open IP
  • SSRS - 条件文本格式(使用 Switch 的表达式)

    我将首先说明这些表达式在报告中确实有效 问题是他们没有一起工作 我目前有一个基于两列值格式化的列标题 根据 Column1 的值使用斜体和下划线 基于 Column2 值的粗体和特定颜色 我通过在文本属性中使用 Switch 表达式来完成此
  • 在 Swift 中实例化并呈现 viewController

    Issue 我开始看Swift Programming Language 不知怎的 我无法正确输入 a 的初始化UIViewController从具体的UIStoryboard In Objective C我简单地写 UIStoryboar
  • 如何使用 FFmpeg 从图像创建视频? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • Rails 应用程序在服务器上速度很快,但从另一台机器访问时速度很慢

    我有一个 Rails 应用程序托管在服务器计算机上 运行 Webrick 当我登录到这台计算机并访问该应用程序 通过 localhost 3000 时 该应用程序运行顺利 但是 当我尝试从另一台计算机 通过主机名 3000 访问该应用程序时
  • 删除一行中重复的相同字符

    我正在尝试创建一种方法 该方法可以从字符串中删除所有重复项 或者根据参数仅在一行中保留相同的 2 个字符 例如 helllllllo gt helo or helllllllo gt hello 这保留了双字母 目前我通过执行以下操作删除重
  • Django 使用 sqlite3 设置?

    我正在尝试按照 django 网站上的演练进行操作 我下载了 sqlite 并将其保存在C Windows System32文件夹 当我编辑settings py文件我该放什么Name场地 我必须建立数据库吗 django 文献说 API
  • 使用 postgres 窗口函数重复行

    postgres 文档 http www postgresql org docs 9 1 static tutorial window html http www postgresql org docs 9 1 static tutoria
  • Argparse:来自文件的默认值

    我有一个 Python 脚本 它需要很多参数 我目前使用的是configuration ini文件 使用读取configparser 但希望允许用户使用命令行覆盖特定参数 如果我只有两个参数 我会使用类似的东西 if not arg1 ar
  • Java 8中basic和url base64编码的区别

    Java 8Base64 http docs oracle com javase 8 docs api java util Base64 html库有两种可用于 URI 构建的变体 基本 变体和 URL 和文件名安全 变体 该文档指出RFC
  • 外部调用的 Lambda 函数超时

    我有一个 Lambda 函数 需要从中进行外部 API 调用 我已将 Lambda 函数添 加到一个安全组 一个 VPC 和 2 个子网 它为我提供了以下文本 当您启用 VPC 时 您的 Lambda 函数将失去默认互联网 使用权 如果您需
  • 如何将字符串转换为 android.net.Uri

    问题 我发现java net URI有一个 create String uri 选项 但是android net uri才不是 进一步来说 我正在尝试获取 RingtoneManager 的输出RingtonePicker并将其设置为默认铃
  • 导入数据和事件溯源

    我目前正在开发一个整体系统 我希望将其引入现代并结合 DDD 和 CQRS 我收到了重新编写解决方案的导入机制的请求 并认为这可能是开始此重新架构过程的好机会 目前流程是 用户上传 CSV 系统解析 CSV 并在屏幕上显示每一行 对每一行以