2012-01-26 145 views
3

我有一个聚合根Order与对应OrderServiceOrderRepositoryDDD:聚合根专业化

我有一个ExtendedOrder与相应的ExtendedOrderServiceExtendedOrderRepository

例如:

class Order { 
    int GetOrderId(); 
} 

class ExtendedOrder : Order { 
    string GetExtendedInfo(); 
} 

我想有OrderServiceOrderExtendedOrder同时返回类型为Order列表。但要获得ExtendedOrder,当Order类型为ExtendedOrder时,它应该询问相应的ExtendedOrderService

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

+0

是从Order继承的ExtendedOrder吗? –

+0

是继承 – Ricibald

+0

Ricibald,你可以发布两个类定义 – smartcaveman

回答

4

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

更多的应用服务的角色见answer to this question。 应用程序服务可以使用多个存储库。

3

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

换句话说单独的域模型的概念,这是为保持一致性,实现了复杂的业务逻辑控制,从报告相关的查询(呈现在UI结果是报告的形式,毕竟)。在某些时候未能做到这种分离总会导致调整领域模型以满足某种UI或报告的要求,而这种情况不应该发生。

在你的情况下,我只是简单地准备一个忽略聚集并选择我需要的所有数据的查询。当然,如果要对结果执行一些业务操作,它应该使用域模型。在所有聚合负责保持一致性之后,唯一会有机会搅乱一致性的是更新数据 - 读取数据不会导致更改,因此在我看来,使用聚合读取数据是毫无意义的。

总结 - 大多数情况下与报告相关的功能不应引起域模型业务概念的调整。

1

如果ExtendedOrderExtended部分是真正的无处不在的语言的领域概念和部分(而不是一个纯粹的UI商品)我赞成组成了继承,使之成为独立的实体,ExtendedOrderDetails例如。

这将是订单总量的一部分,因此通过OrderService提供的Order访问。

1

鉴于ExtendedOrder从订单继承,那么你通常不会有ExtendedOrderRepository和ExtendedOrderService - 在OrderRepository和OrderService就足够了。

的ExtendedOrder仍然是一个令,所以应该生活秩序聚合根的范围内,并使用OrderRepository和OrderService。

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

以这种方式工作使本身更优雅的代码和更少的重复。代码可能看起来像:

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(); 
     } 
    } 
} 

,如果需要的话,你仍然可以明确的秩序和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 
    } 
} 

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

+0

是的,但我需要关于我的域方法中的ExtendedOrder的特定数据 – Ricibald