ExtendedOrderがOrderから継承した場合、通常はExtendedOrderRepositoryとExtendedOrderServiceはなく、OrderRepositoryとOrderServiceで十分です。
ExtendedOrderは依然としてOrderであるため、Order集約ルートの境界内に存在し、OrderRepositoryとOrderServiceを使用する必要があります。
OrderRepositoryはOrderオブジェクトを返します。これは拡張オーダーでも、そうでなくてもかまいません。 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();
}
}
}
及び必要であれば、あなたはまだ明示的秩序と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」)を作成するために継続することができますなしリポジトリとサービスの普及。
ExtendedOrderはOrderから継承されていますか? –
はい継承しました – Ricibald
Ricibald、2つのクラス定義を投稿できます – smartcaveman