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

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

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

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

最佳答案

不,将存储库注入(inject)域对象是不行的 :)

什么是可以接受的,但前提是确实没有其他方法,是将存储库或其他域对象(例如服务)传递到 AR 方法中,以通过双调度方法执行某些功能:

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

正如我在其他帖子中提到的,我倾向于将 AR 视为物理计算器。有输入,通过键盘,有输出,通过屏幕。当计算器在做它的伏都教时,它不会与其他任何东西交互,也不会要求额外的信息。话虽如此,上面的例子中可能会有异常(exception),但我想折扣可以由操作脚本(服务层)决定:
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)));
    }
}

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

关于asp.net - 在领域驱动设计架构中用数据填充领域对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32671398/

10-13 06:27