0

我正在重构一个项目以使其更接近 DDD。该项目是用 VB.Net 编写的,并使用 WinForms 到 UI。我一直在学习DDD,但我仍然没有很清楚。

我使用存储库模式和 SqlKata 来创建和执行 SQL 语句。我阅读了为什么应在应用程序服务中处理事务,但我认为在存储库中处理事务的某些情况可能是一个好主意。一个例子:

具有列表属性Lines的域模型Order。一个名为FindOrderService的服务。该服务使用OrderRepository及其函数.FindById(...)。此存储库返回Order及其Lines。在数据库中OrderOrderLines是两个不同的表。

I.存储库函数不应该通过必须使用两个表来确保域对象以一致的状态创建来处理事务吗?使用函数.Add(...)不会发生同样的事情吗?

二、应用程序服务可能会或可能不会以事务方式使用。但他们不知道有多少表用于持久化聚合。即使它也可以从应用程序服务中处理,难道不能确保这样的事情是基础设施的问题吗?

三、从我读到的。似乎存在两个术语:“业务交易”和“技术交易”(在这篇文章中)。这是技术交易的例子吗?

提前致谢!

编辑:

我的问题,更具体地说,是:如果应用程序服务可以选择服务本身是否可以从数据库启动事务,如何从存储库(如果它们使用多个表)中确保域模型必须返回还是持久化是一致的?

我认为在这篇文章中已经更详细地讨论了这个问题。此响应与我正在寻找的响应接近,但不清楚是否可以使用存储库中的数据库事务或如何正确处理。

4

1 回答 1

0

我阅读了为什么应在应用程序服务中处理事务,但我认为在存储库中处理事务的某些情况可能是一个好主意。

特定场景允许以两种不同的方式完成事情这一事实并不意味着我们应该选择“规则破坏者”方式:在事务的上下文中拥有单个存储库并不能证明让存储库拥有事务是合理的。根据设计,事务应跨越一个或多个存储库。

。可以在应用程序级别抽象出事务,但“包含”单个存储库,该存储库查询/更新两个表以保持一致性。

.事务、存储库、聚合——所有这些都应该在应用程序级别被抽象出来。确实,基础架构级别是您创建具体实现(技术事务、几个表、一些实体)的地方,但应用程序并不关心单个工作单元(事务)跨越实际上“隐藏”八个表的四个存储库。

.商业交易和技术交易可以重叠,但不是必须的。例如,您可以有一个业务流程,其中执行多个技术事务(单个流程可能在不同的数据库上操作),将单个业务事务组合在一起。

更新:

确实建议在聚合和事务之间建立 1:1 的关系,但是聚合可以以一对多的方式嵌入其他非聚合实体,即本地实体(例如订单及其订单行) ,可以很自然的体现为DB中的两张表(父表、子表)。因此,显然可以在一个事务的上下文中更新多个表,以保持域模型的一致性。

使用能够跟踪一组更改并立即提交/撤消它们的数据存储引擎来识别术语“存储库”是有意义的。但更重要的是,代码上下文中的存储库是与此类存储通信的对象的抽象,并且可以通过设计决定具有两个存储库接口:一个用于父表(IOrder),第二个用于子表(IOrderLine)。

存储库不负责提供有关域模型一致性的保证。存储库只是与数据存储进行通信的接口,应用层负责适当的编排,即将一个或多个存储库接口限定为单个工作单元(例如事务)。应用程序服务使用域模型提供的工具定义业务流程,无论是单个存储库接口持久保存两个表还是两个存储库接口每个都持久保存一个表。

于 2021-10-27T22:01:32.637 回答