我有两个表account
和address
。 account
依赖于address
的含义才能创建account
,您必须先创建一个address
并将其命名为address.id
。
在address
创建失败或account
创建失败的情况下,我不能依靠数据库。
因此,我必须进行交易。
如果我在提供者中运行交易,该类将注入所有必需的服务以执行我需要的操作(即创建帐户),在本例中,它使用{{ 1}}和addressService
,有人告诉我这样做是一种反模式,因为事务和与数据库相关的所有事物都必须在accountService
中运行。
但是如何?我必须在两个不同的存储库repository
和addressRepository
中运行操作。
在两个不同服务上使用多个存储库时,启动和提交事务的最佳实践是什么?
答案 0 :(得分:0)
我建议您创建另一个服务(addressAcountService),并且仅在您使用两个实体的操作中使用该服务,这是我认为最安全的方法。
在服务方法上,我没有看到在存储库逻辑中添加一层的任何反模式,因为我看到将存储库分为服务可以使系统更加可扩展和 maintainable (可维护性),因为您可以防止代码重复,甚至可以阻止访问项目中的其他位置,您不希望他们在没有控制的情况下修改数据库,并且如果将来要更改为,则甚至可以防止这种情况一个不同的 DBMS 甚至是 ORM ,您只需更改依赖关系,而无需更改CRUD操作的整个实体逻辑。举个例子,假设在应用程序的早期开发过程中,您决定在用户需要时硬 DELETE 删除数据库中的所有行,因为系统开始增长,您检测到删除操作没有最安全的操作,因为您有很多级联的删除操作,并且在某些情况下,删除一行需要很长时间(我在这里有点夸张),然后您想要将其更改为软( UPDATE 一个标志)删除,如果您要使用存储库进行所有操作,那将是一件令人头疼的事情,因为您需要在级联时更改使用存储库及其关系的代码的每个部分,不仅仅在谈论 Delete 操作,您需要照顾 SELECTS UPDATES ,甚至在 INSERTs 您在其中寻找独特的属性。在服务方法上,您更改了对不同控制器可用的操作中的逻辑,就是这样,甚至您可以创建另一个服务并替换依赖项。