六边形架构和交易概念
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 页)中谈到了这个话题
我正在努力适应六边形架构,但不知道如何解决常见的实际问题,这些问题已经用不同的方法实现了。我认为我的核心问题是了解提取到适配器和端口的责任级别。
阅读网络上的文章,可以使用原始示例,例如:
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 页)中谈到了这个话题