我一直在努力将域驱动的设计模式应用到我们的Web应用程序中。我们遇到的一个问题是避免在实体中使用存储库。
例如,我们有一些实体,其方法将触发电子邮件。因此,我们必须能够访问电子邮件模板(存储在数据库中),以及在数据库队列表中创建新的电子邮件记录。我们目前通过访问这些实例中的存储库来违反该模式。
我们是否应该在这些实例中使用“服务”或“应用程序”层(我们有很多)?有没有更好的方法来解决这个问题?
答案 0 :(得分:5)
是的,我建议您创建一项服务来执行电子邮件的发送。您可以在与域模型相同的项目中创建与服务交互的接口,但在单独的项目中提供服务的实现,以便模型与服务之间没有硬依赖关系。依赖性是相反的 - 从服务到模型。这也为实现单元测试创建了一个更好的设置,以确保在应该的情况下调用您的服务,因为您现在可以在单元测试中模拟服务。
要做的一件事是确保在创建其中一个对象类型时注入您的服务。因此,您将对象创建推迟到存储库。或者甚至更好,使用依赖注入框架来解决依赖关系。
答案 1 :(得分:3)
域应该是持久性无知的。你不应该与存储库"来自内部。
在您的方案中 - I would raise domain event(例如"客户正在购买某物")并处理从外部发送的电子邮件。