我猜“删除”是指持久层中的删除。如果是这样,则应将级联删除放在此处而不是在用例中。
您可能有一个 CMS 系统,用户可以在其中为网络创建页面。这些页面包含部分、图像,可能有附件等。用例“删除页面”可能会在请求存储库删除页面之前执行一些验证逻辑,但随后存储库负责删除。存储库的作用很大程度上取决于您使用的存储类型。例如。如果“页面”是您的聚合根并且存储库使用面向文档的 nosql db,它只会删除文档,并且所有包含的内容(例如图像、附件)都消失了。如果持久层使用关系数据库,它可能会从不同的表中删除行,或者它也只删除页面行,其余的由数据库的级联删除配置完成。
因此我认为它应该放在持久层中。
编辑
就我而言,数据不一定只存储在数据库中,还可以通过不同的存储介质存储(例如某些文件存储中的二进制文件)。
....
您的建议似乎需要引用其他存储库的存储库。这是你的意思吗?
UserRepo 可以在 DocumentRepository 上调用 delete,但您也可以使用接口反转依赖关系,例如一个UserChangedHandler,它有一个方法onUserDeleted()。
+------------+ +--------------------+
| DBUserRepo | -----> | UserChangedHandler |
+------------+ +--------------------+
^
|
+-----------------+--------------+
| |
+------------------------+ +---------------------+
| FileDocumentRepository | | RestImageRepository |
+------------------------+ +---------------------+
如您所见,ChangeHandler 可以由任何其他存储库实现。它可能会删除存储在本地文件系统上的Documents 和存储在远程服务器上的Images。
存储库实现UserChangeHandler,或者您创建一个适配器以将处理程序逻辑与存储库分开。
+------------+ +--------------------+
| DBUserRepo | -----> | UserChangedHandler |
+------------+ +--------------------+
^
|
+---------------------------+ +------------------------+
| DocumentUserChangeAdapter | ---> | FileDocumentRepository |
+---------------------------+ +------------------------+
在分布式环境中,ChangeHandler 也可能向队列发送消息,其他系统将异步删除其他数据。
您的描述似乎还意味着“用户回购”将了解整个数据层次结构(用户 -> SomeData -> SomeOtherData),因此每当层次结构中发生任何变化时,都会影响“用户回购” .
正如我在上面试图展示的,这并不一定意味着UserRepo 实现知道所有其他数据结构和持久性类型。持久性管理不能驻留在同一台服务器上,也不能在同一进程中运行。
如何构建系统由您决定。有许多不同的方法可以解决它,具体取决于功能和非功能需求。
PS:您使用 typescript 标记您的问题,因此您可能希望像这样定义UserChangeHandler
export type UserChangeHandler = (userId : string) => void;
如果更改处理程序应支持异步,则返回 Promise<void>。