【问题标题】:Domain-driven design pattern - accessing repository from domain领域驱动设计模式 - 从领域访问存储库
【发布时间】:2011-03-07 18:50:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: design-patterns domain-driven-design


    【解决方案1】:

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

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

    【讨论】:

    • 使用服务是一个好方法。关于服务的注入:最好使用双重调度方法,将服务传递给方法而不是构造函数。这揭示了哪些方法依赖于服务,并允许您为每种方法使用不同的服务实现。
    【解决方案2】:

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

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

    【讨论】:

    • "域应该是持久性无知的。" - 真的。 “您不应该从内部“与存储库交谈”。” - 错误的。您应该访问应该在外部实现的存储库的接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    相关资源
    最近更新 更多