六边形架构和交易概念

hexagonal architecture and transactions concept

我正在努力适应六边形架构,但不知道如何解决常见的实际问题,这些问题已经用不同的方法实现了。我认为我的核心问题是了解提取到适配器和端口的责任级别。

阅读网络上的文章,可以使用原始示例,例如:

we have RepositoryInterface which can be implemented in mysql/txt/s3/nosql storage

we have NotificationSendingInterface and have email/sms/web push realizations

但这些都是非常精炼的例子,只是 interface/realization 细节分离。

然而在实践中,我们通常所知道的接口+实现在领域模型中编码服务更深入地保证。

为了举例说明,我决定询问存储+交易对。

在十六进制架构中应该如何实现存储的事务概念? 假设我们在域级别

内有简单的 crud 服务接口
StorageRepoInterface
   save(...)
   update(...)
   delete(...)
   get(...)

我们在使用这些方法时需要某种交易保证,例如一次删除+保存。

按照十六进制的概念应该如何设计和实现?

是否应该用TransactionalOperation的一些外部协调接口来实现?如果是,那么一般来说,TransactionalOperation 必须知道如何使用 StorageRepoInterface(mb 在其他面向事务的操作接口中的所有实现来实现事务保证)

如果没有,那么似乎应该有来自 StorageRepoInterface 的显式事务保证在域级别(十六进制内)和其他方法?

无论哪种方式都不像 "isolated and interfaced based" 所说的那样。

谁能告诉我如何在这种情况下正确改变心态或在哪里阅读?

提前致谢。

在 Hex Arch 中,驱动程序端口是应用程序的 API,即用例边界。用例是事务性的。所以你必须控制驱动程序端口方法的事务性。您将每个方法都包含在一个事务中。

如果您使用 Spring,您可以使用声明式事务(@Transactional 注释)。

另一种方法是在执行该方法之前显式打开一个数据库事务,并在该方法之后关闭(提交/回滚)它。

应用事务性的一个有用模式是命令总线,用装饰器包装它,将命令封装在事务中。

事务是基础结构,因此您应该有一个驱动端口和一个实现该端口的适配器。

实现必须使用与持久性适配器(存储库)相同的数据库上下文(实体管理器)。

Vaughn Vernon 在他的书 "Implementing DDD".

的 "Managing transactions" 部分(第 432-437 页)中谈到了这个话题