领域驱动设计模式——从领域访问存储库

6
我一直在尝试将领域驱动设计模式应用到我们的Web应用程序中。我们遇到的一个问题是如何避免在实体内使用仓储。
例如,我们有一些实体的方法会触发电子邮件。因此,我们需要访问电子邮件模板(存储在数据库中),并在数据库队列表中创建新的电子邮件记录。我们目前通过在这些情况下访问仓库来违反该模式。
在这些情况下,我们应该使用“服务”或“应用程序”层吗(我们有很多这样的情况)?有没有更好的方法来解决这个问题?
2个回答

5

是的,我建议创建一个服务来执行电子邮件发送。您可以在与域模型相同的项目中创建一个与服务交互的接口,但是在单独的项目中提供服务的实现,以便从模型到服务没有硬依赖关系。依赖性被反转-从服务到模型。这也为实施单元测试创建了更好的设置,以确保您的服务在应该调用它的情况下被调用,因为您现在可以在单元测试中模拟服务。

唯一剩下要做的事情是确保每次创建这些对象类型时都注入您的服务。因此,您将延迟对象创建到存储库。或者更好的是,使用依赖注入框架为您解决依赖关系。


1
使用服务是一个不错的方法。关于服务的注入,最好采用双重派发(double-dispatch)的方式通过把服务传递给方法,而不是构造函数。这样可以清楚地展示哪些方法依赖于该服务,并允许您针对每个方法使用不同的服务实现。 - Niels van der Rest

3

领域应该是持久性无知的。你不应该从内部“与仓库交谈”。

在您的场景中 - 我会引发领域事件(例如,“客户正在购买某物”),并从外部处理电子邮件发送。


5
"Domain should be persistence ignorant." - 确实。 "You shouldn't "talk with repository" from within." - 不确切。应该访问存储库的接口,而接口应该在外部实现。 - dariol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接