在域驱动设计架构中使用数据填充域对象
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)));
}
}
这些只是一些虚构的想法,但可能会让您思考您的场景:)
我对领域驱动设计架构中的领域层有点困惑。
我理解这四层是表示层、应用层、领域层和基础设施层,其中基础设施包含数据存储库。
我也明白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)));
}
}
这些只是一些虚构的想法,但可能会让您思考您的场景:)