六边形架构和交易概念

rec*_*_ro 9 architecture interface hexagonal-architecture

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

在网络上阅读文章,使用简单的示例就可以了,例如:

我们有RepositoryInterface,可以在mysql/txt/s3/nosql存储中实现

或者

我们有NotificationSendingInterface并且有电子邮件/短信/网络推送实现

但这些都是非常精致的示例,并且只是接口/实现细节的分离。

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

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

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

StorageRepoInterface
   save(...)
   update(...)
   delete(...)
   get(...)
Run Code Online (Sandbox Code Playgroud)

我们希望在使用这些方法时得到某种事务保证,例如在一个事务中删除+保存。

按照hex的构思应该如何设计和实现呢?

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

如果不是,那么域级别(十六进制内部)的StorageRepoInterface似乎应该通过其他方法提供显式事务保证?

不管怎样,它看起来并不像所说的那样“隔离和基于接口”。

有人可以指出我如何在这种情况下正确改变心态或在哪里阅读?

提前致谢。

cho*_*o70 11

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

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

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

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

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

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

Vaughn Vernon 在他的书“Implementing DDD”的“Managing transactions”部分(第 432-437 页)讨论了这个主题。