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
列表的形式返回typeOrder
和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
}
}