洋葱架构、持久化和通知

Onion Architectures, persistence and notifications

我正在研究Onion Architectures,我有一个观点。

洋葱架构旨在将域与技术工件隔离开来。因此,准则是让数据访问层 (DAL) 引用域层 (BL)。这样,我应该能够将实体转换为存储工件。引用 BL 可能会给我一个 "snapshot" 我的域,但是如果没有更改跟踪系统,我将丢失所有按时间顺序排列的事件以了解是否插入、更新或删除数据存储中的项目,以便能够之后正确地给模型补水。

洋葱架构是否总是需要一些变更跟踪系统,甚至像事件存储之类的东西?我是否遗漏了任何其他模式?

域层知道什么时候需要持久化吗?

例如,我可能有一个 new/update 客户屏幕,当我按完成时它会保存一个新客户。那时我不关心更改跟踪,我只想存储我拥有的所有内容。我的 DAL 可以确定我是否已经在数据库中拥有同名的客户(如果它应该发出插入或更新查询)。

同样的事情也适用于事件存储。如果您的域关心事件,能够撤消事件等,如果技术实现和事件存储,

可能会发生的情况是,您的域层始终由一个完整的内存中实时变异系统组成。在那种情况下甚至没有快照。

洋葱架构只是描述了工件的分离。它们是哪些工件将真正取决于特定要求。

应用层应该负责这个。应用程序服务通过编排对域的调用来实现用例。作为用例的一部分创建或修改的域实体必须以一种或另一种形式保存在内存中,以便以后持久化。

典型的做法是将它们放入一个工作单元(其实现驻留在基础结构层中)。它跟踪对域实体所做的修改。当应用程序服务结束业务事务时,工作单元会将实体状态转换为可刷新到持久存储的内容。