Given that ExtendedOrder inherits from Order then you would not normally have an ExtendedOrderRepository and ExtendedOrderService - the OrderRepository and OrderService would be sufficient.
An ExtendedOrder is still an Order, so it should live within the boundaries of the Order aggregate root and use the OrderRepository and OrderService.
The OrderRepository will return Order objects, which may or may not be Extended Orders. ORMs such as NHibernate support this behaviour out of the box.
Working in this way lends itself to more elegant code and less repetition. Code might look like:
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();
}
}
}
and if need be you can still explicitly distinguish between Order and 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
}
}
This approach lets you continue to create other Order types (e.g. "SpecialOrder") without a proliferation of repositories and services.