Design patterns 域驱动设计模式-从域访问存储库

Design patterns 域驱动设计模式-从域访问存储库,design-patterns,domain-driven-design,Design Patterns,Domain Driven Design,我一直致力于将领域驱动的设计模式应用于我们的web应用程序。我们遇到的问题之一是避免从实体中使用存储库 例如,我们有一些实体,其方法将触发电子邮件。因此,我们必须能够访问电子邮件模板(存储在数据库中),并在数据库队列表中创建新的电子邮件记录。我们目前通过访问这些实例中的存储库违反了该模式 在这些情况下,我们应该使用“服务”层还是“应用”层(我们有很多)?有没有更好的方法来解决这个问题?是的,我建议创建一个服务来执行电子邮件的发送。您可以在与域模型相同的项目中创建与服务交互的接口,但在单独的项目中

我一直致力于将领域驱动的设计模式应用于我们的web应用程序。我们遇到的问题之一是避免从实体中使用存储库

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


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

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


剩下要做的一件事是确保在创建这些对象类型时随时注入服务。因此,您可以将对象创建延迟到存储库。或者更好的是,使用依赖项注入框架为您解决依赖项。

域应该是持久性的。您不应该从内部“与存储库交谈”


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

使用服务是一个很好的方法。关于服务的注入:最好使用双重分派方法,将服务传递给方法,而不是构造函数。这揭示了哪些方法依赖于服务,并允许您对每个方法使用不同的服务实现。“域应该是持久性无关的。”-正确。“你不应该从内部“与存储库交谈。”-错。您应该访问应该在外部实现的存储库的接口。