是洋葱架构和域驱动设计中允许的以下优秀设计吗?
说你有一个像这样的“订单”域类
class Order
{
INotificationService _notificationService;
ICartRepository _cartRepository;
void Checkout(Cart cart, bool notifyCustomer)
{
_cartRepository.Save(cart);
if (notifyCustomer)
{
_notificationService.sendnotification();
}
}
}
设置域模型调用基础设施接口是好还是坏?(在这种情况下,通知服务和CartRepository)
答案 0 :(得分:1)
我认为INotificationService是域概念而不是基础架构服务。我们可以将其建模为DomainEvent,告诉“客户有关购物车的信息已保存”。
如何将INotificationService移动到域层并将其重命名为“CartDomainEvents”。
CartDomainEvents.raise(CartSavedEvent(...));
在一般情况下,调用基础架构组件会引入双向依赖关系,这通常不是一个好的设计。
答案 1 :(得分:1)
只有在INotificationService
(ICartRepository
)图层和中定义Domain
和Core
接口时,您的设计才会正常'在运行时通过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)
减少耦合。