域模型应该调用基础架构接口吗

时间:2013-11-22 18:36:08

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

是洋葱架构和域驱动设计中允许的以下优秀设计吗?

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

class Order
{
  INotificationService _notificationService;
  ICartRepository _cartRepository;

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

设置域模型调用基础设施接口是好还是坏?(在这种情况下,通知服务和CartRepository)

4 个答案:

答案 0 :(得分:1)

我认为INotificationService是域概念而不是基础架构服务。我们可以将其建模为DomainEvent,告诉“客户有关购物车的信息已保存”。

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

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

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

答案 1 :(得分:1)

只有在INotificationServiceICartRepository)图层中定义DomainCore接口时,您的设计才会正常'在运行时通过Dependency Resolution层(Onion架构的最外层)实现正确的实现。

请记住,在洋葱架构中,您的Domain图层无法引用任何库。

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

答案 2 :(得分:0)

存储库层存在于域的每个聚合,存储库位于域之上,您可以在域中拥有存储库基础接口,它们位于基础结构中但您无法在模型中看到存储库实现(它&#39 ;不正确)。 在所有层中都可访问的基础架构中有一些基本接口,如UnitOfWrok,Repository,Specificationm authentication和....我建议看一下用.net编写的aghata商店前端,看看真实的实施项目https://github.com/elbandit/Asp-Net-Design-Patterns-CQRS

答案 3 :(得分:0)

存储库属于基础架构层 使用Icart界面

也会更好
void Checkout(ICart cart, bool notifyCustomer)

减少耦合。