2011-03-07 65 views
6

我一直在努力将域驱动设计模式应用到我们的Web应用程序。我们遇到的一个问题是避免在实体内部使用存储库。域驱动设计模式 - 从域访问存储库

例如,我们有一些实体的方法会触发电子邮件。因此,我们必须有权访问电子邮件模板(存储在数据库中),并在数据库队列表中创建新的电子邮件记录。我们目前通过访问这些实例中的存储库来违反该模式。

我们应该在这些情况下使用“服务”还是“应用程序”层(我们有很多)?有没有更好的方法来解决这个问题?

回答

5

是的,我会建议创建一个服务来执行发送电子邮件。您可以创建一个用于与域模型在同一项目中与服务进行交互的接口,但是可以在单独的项目中提供服务的实现,以便从模型到服务之间不存在硬性依赖关系。依赖关系颠倒了 - 从服务到模型。这也为实现单元测试创​​建了一个更好的设置,以确保您的服务在应该被调用的环境下调用,因为您现在可以在单元测试中模拟服务。

剩下要做的一件事就是确保在任何时候创建这些对象类型时都会注入您的服务。所以,你会将对象创建延迟到存储库。或者甚至更好,使用依赖注入框架来解决你的依赖。

+1

使用服务是一种好方法。关于注入服务:最好是通过将服务传递给*方法*而不是*构造函数*来使用双重调度方法。这揭示了哪些方法依赖于服务,并允许您为每种方法使用不同的服务实现。 – 2011-03-12 22:45:05

3

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

在您的方案中 - I would raise domain event(例如“客户正在购买东西”)并处理从外部发送的电子邮件。

+3

“域名应该是持久性无知的。” - 对。 “你不应该从内部与储存库交谈。” - 假。您应该访问应该在外部实现的存储库的界面。 – dariol 2013-07-06 09:42:15