Inheritance 聚合根特化

Inheritance 聚合根特化,inheritance,service,domain-driven-design,Inheritance,Service,Domain Driven Design,我有一个聚合根Order,对应的OrderService和OrderRepository 我有一个ExtendedOrder和相应的ExtendedOrderService和ExtendedOrderRepository 例如: class Order { int GetOrderId(); } class ExtendedOrder : Order { string GetExtendedInfo(); } 我想让OrderService以Order列表的形式返回typeOrd

我有一个聚合根
Order
,对应的
OrderService
OrderRepository

我有一个
ExtendedOrder
和相应的
ExtendedOrderService
ExtendedOrderRepository

例如:

class Order {
   int GetOrderId();
}

class ExtendedOrder : Order {
   string GetExtendedInfo();
}
我想让
OrderService
Order
列表的形式返回type
Order
ExtendedOrder
。但要获得
ExtendedOrder
,当
Order
类型为
ExtendedOrder
时,应请求相应的
ExtendedOrderService

有可能获得这种行为吗?
让聚合根扩展另一个聚合根是否合法?

您不需要ExtendedOrderService。只需使用一个OrderService来协调OrderRepository和ExtendedOrderRepository的结果

有关应用程序服务的角色的更多信息,请参阅。
一个应用程序服务可以利用多个存储库。

主要问题是,您需要它做什么。我怀疑这与某种用户界面或报告功能有关。如果是这种情况,我的建议是不要在这些查询中使用域模型概念

换句话说,将域模型概念与报告相关查询(在UI上显示结果毕竟是报告的一种形式)分开,域模型概念对于保持一致性和实现对复杂业务逻辑的控制非常重要。如果在某一点上不进行分离,总是会导致调整域模型以满足某种UI或报表的需求,这是不应该发生的

在您的情况下,我只需准备一个忽略聚合并选择我需要的所有数据的查询。当然,当对结果执行某些业务操作时,它应该使用域模型。毕竟,所有的聚合都负责保持一致性,唯一有可能影响一致性的事情就是更新数据——读取数据不会导致更改,因此在我看来,使用聚合进行读取是毫无意义的


总之,大多数场景中与报告相关的功能不应导致域模型业务概念的调整

如果
ExtendedOrder
Extended
部分真的是一个领域概念,是无处不在的语言的一部分(而不是纯粹的UI商品),那么我倾向于组合而不是继承,并将其作为一个单独的实体,例如
ExtendedOrderDetails


它将是订单聚合的一部分,因此可以通过
OrderService
提供的
Order
进行访问如果ExtendedOrder继承自Order,那么您通常不会拥有ExtendedOrderRepository和ExtendedOrderService-OrderRepository和OrderService就足够了

ExtendedOrder仍然是订单,因此它应该位于订单聚合根的边界内,并使用OrderRepository和OrderService

OrderRepository将返回订单对象,这些对象可能是扩展订单,也可能不是扩展订单。诸如NHibernate之类的ORM支持这种开箱即用的行为

以这种方式工作会使代码更加优雅,重复次数更少。代码可能如下所示:

public class Order
{
    public virtual void Process()
    {
        // do processing stuff to an order
        // ...
    }
}

public class ExtendedOrder : Order
{
    public override void Process()
    {
        // do the standard order processing
        base.Process();
        // do extra processing specific to an extended order
        // ...
    }
}


public class OrderService
{
    public void ProcessRecentOrders()
    {
        IEnumerable<Order> orders = orderRepository.GetRecentOrders();
        // orders may include Order and ExtendedOrder objects in the collection...
        foreach (Order in orders)
        {
            // ...but polymorphism ensures that we don't need to know whether order is an ExtendedOrder or an Order
            order.Process();
        }
    }
}

通过这种方法,您可以继续创建其他订单类型(例如“SpecialOrder”),而不会增加存储库和服务。

ExtendedOrder是从Order继承的吗?Ricibald,您可以发布这两个类的定义吗?但我需要在我的域方法中提供有关ExtendedOrder的特定数据
public void SendOrder(Order order)
{
    // do normal order sending stuff
    orderSender.TransmitOrder(order);
    if (order is ExtendedOrder)
    {
        // do additional stuff required by an ExtendedOrder
    }
}