3

洋葱架构和领域驱动设计中是否允许以下​​良好设计和允许?

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

class Order
{
  INotificationService _notificationService;
  ICartRepository _cartRepository;

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

拥有基础设施的领域模型调用接口是好还是坏的设计?(在这种情况下,notificationservice 和 CartRepository)

4

4 回答 4

2

只有在您的( ) 层中定义了INotificationService和接口,并且如果它们在运行时与您的层(洋葱架构的最外层) 的正确实现绑定,您的设计才是正确的。ICartRepositoryDomainCoreDependency Resolution

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

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

于 2013-11-25T14:33:44.463 回答
1

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

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

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

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

于 2013-11-23T01:25:31.133 回答
0

存储库属于基础设施层,最好使用 Icart 接口

void Checkout(ICart cart, bool notifyCustomer)

以减少耦合。

于 2015-02-20T18:26:33.990 回答
0

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

于 2013-12-11T07:35:16.973 回答