在域驱动设计架构中使用数据填充域对象

Populating Domain objects with data in a Domain Driven Design architecture

我对领域驱动设计架构中的领域层有点困惑。

我理解这四层是表示层、应用层、领域层和基础设施层,其中基础设施包含数据存储库。

我也明白Domain层负责业务规则。在现在过时的贫血模型中,域对象没有任何行为。在 DDD 中,我们应该将行为和业务规则从服务移动到域。

以前,我会将存储库注入服务层。所以我的问题是 - 是否可以将存储库注入域对象以便它们可以执行业务规则?

不,可以将存储库注入域对象:)

什么是可以接受的,但前提是 真的 别无他法,就是将存储库或其他域对象(例如服务)传入 AR 方法以通过以下方式执行某些功能双分派方法:

public void ApplyDiscount(IDiscountService service)
{
    _discount = service.Discount(customerType);
}

正如我在其他帖子中提到的,我倾向于将 AR 视为物理计算器。有输入,通过键盘,有输出,通过屏幕。当计算器执行它的巫术操作时,它不会与其他任何东西交互,也不会要求提供额外的信息。话虽这么说,但可能会有例外,如上例所示,但我想折扣可以由操作脚本(服务层)确定:

public void RegisterOrderTask
{
    private IDiscountService _discountService;
    private IOrderRepository _orderRepository;

    public void RegisterOrderTask(IDiscountService discountService, IOrderRepository orderRepository)
    {
        _discountService = discountService;
        _orderRepository = orderRepository;
    }

    public void Execute(OrderDetails details)
    {
        _orderRepository
           .Add(details.CreateOrder()
                   .SetDiscount(_disocuntService.Discount(details.CustomerType)));
    }
}

这些只是一些虚构的想法,但可能会让您思考您的场景:)