【问题标题】:Should domain models call infrastructure interfaces?领域模型应该调用基础设施接口吗?
【发布时间】:2015-02-21 02:26:33
【问题描述】:

在洋葱架构和领域驱动设计中,以下良好的设计和允许的设计是什么?

假设你有一个像这样的“订单”域类

class Order
{
  INotificationService _notificationService;
  ICartRepository _cartRepository;

   void Checkout(Cart cart, bool notifyCustomer)
   {
         _cartRepository.Save(cart);
         if (notifyCustomer)
         {
            _notificationService.sendnotification();
         }
   }
}

有基础设施的领域模型调用接口是好还是坏设计?(本例中为notificationservice和CartRepository)

【问题讨论】:

  • 您确定致电客户通知是您的订单的问题吗?这对我来说似乎是应用程序级别的问题。客户结帐时需要执行的未来操作如何,例如为未来的销售提供信用、通知您的内部统计数据库、其他簿记等?你总是要修改你的 Order 类吗?对于 SPR 原则,我建议按照以下答案提出领域事件,并在独立观察者中处理该事件。

标签: domain-driven-design ddd-repositories onion-architecture


【解决方案1】:

只有在Domain (Core) 层中定义了INotificationServiceICartRepository 接口并且如果它们在运行时与正确的绑定,您的设计才会正常由您的Dependency Resolution 层(洋葱架构的最外层)实现。

请记住,在 Onion 架构中,您的 Domain 层不能引用任何库。

ICartRepository 的实现显然将在您的Infrastucture 层中完成,因为它肯定会与您的数据访问层技术相关联。
如果您的INotificationService 实现需要与外部服务通信,那么它也会转到Infrasrtructure。但如果它是您业务的一部分,那么它的实现可能在Domain 层中。

【讨论】:

    【解决方案2】:

    我认为 INotificationService 是一个领域概念,而不是基础设施服务。我们可以将其建模为一个 DomainEvent 告诉“客户关于购物车已保存”。

    如何将 INotificationService 移动到域层并将其重命名为“CartDomainEvents”。

    CartDomainEvents.raise(CartSavedEvent(...));
    

    一般情况下,调用基础设施组件会引入双向依赖,这通常不是一个好的设计。

    【讨论】:

    • "Calling infrastructure components introduces bidirectional dependencies which is usually not a good design"。你绝对是对的,但请记住,在洋葱架构中,所有依赖项都朝向中心!所以无论如何都不应该允许双向依赖!
    【解决方案3】:

    每个域的聚合都存在存储库层,存储库位于域之上,您可以在您的域上拥有存储库基础接口,它们位于基础架构中,但您无法在模型中看到存储库实现(这是不正确的)。 在您的基础架构中,有一些基本接口,例如 UnitOfWrok、Repository、Specificationm 身份验证等,可在所有层访问。推荐看一下用.net写的aghata store front,看看真正的实现项目https://github.com/elbandit/Asp-Net-Design-Patterns-CQRS

    【讨论】:

      【解决方案4】:

      repository 属于基础设施层 也最好用Icart接口

      void Checkout(ICart cart, bool notifyCustomer)
      

      减少耦合。

      【讨论】:

        猜你喜欢
        • 2021-01-08
        • 1970-01-01
        • 2018-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-07
        • 2014-06-16
        • 2020-12-07
        相关资源
        最近更新 更多