洋葱架构,持久性和通知

时间:2016-06-16 16:50:25

标签: c# design-patterns architecture domain-driven-design onion-architecture

我正在学习洋葱建筑,我有一点意见。

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

洋葱架构是否总是需要一些变更跟踪系统,甚至是事件存储?我错过了其他任何模式吗?

2 个答案:

答案 0 :(得分:3)

域层是否知道何时需要持久化?

例如,我可能有一个新的/更新客户屏幕,当我按完成后会保存新客户。那时我不关心变化跟踪,我想只存储我拥有的一切。我的DAL可以判断我是否已经在数据库中拥有一个具有相同名称的客户(如果它应该发出插入或更新查询)。

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

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

洋葱架构只是描述了人工制品的分离。它们的哪些工件确实取决于特定的要求。

答案 1 :(得分:2)

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

执行此操作的典型方法是将它们放入工作单元(其实现位于基础结构层中)。它跟踪对域实体所做的修改。当应用程序服务结束业务事务时,工作单元会将实体状态转换为可以刷新到持久存储的东西。