エンティティは、ドメインの「単位」です。リポジトリとサービスはそれらを参照しますが、その逆はありません。このように考えてみてください: DMV をポケットに入れて持ち歩いていますか?
OrderItem
集約ルートではありません。リポジトリからアクセスできないようにする必要があります。その ID は anOrder
に対してローカルです。つまり、Order
について話すときは常に an がスコープ内になりますOrderItem
。
クエリのホームを見つけるのが難しいため、サービスについて考えるようになりました。この場合、それらは、それ自体が知るのが難しい、についての何かを表します。Order
Order
ドメイン プロジェクトでインテントを宣言します。
public interface ICheapestItemService
{
OrderItem GetCheapestItem(Order order);
}
public interface IInventoryService
{
IEnumerable<OrderItem> GetOutOfStockItems(Order order);
}
データ プロジェクトで実装を宣言します。
public class CheapestItemService : ICheapestItemService
{
private IQueryable<OrderItem> _orderItems;
public CheapestItemService(IQueryable<OrderItem> orderItems)
{
_orderItems = orderItems;
}
public OrderItem GetCheapestItem(Order order)
{
var itemsByPrice =
from item in _orderItems
where item.Order == order
orderby item.Price
select item;
return itemsByPrice.FirstOrDefault();
}
}
public class InventoryService : IInventoryService
{
private IQueryable<OrderItem> _orderItems;
public InventoryService(IQueryable<OrderItem> orderItems)
{
_orderItems = orderItems;
}
public IEnumerable<OrderItem> GetOutOfStockItems(Order order)
{
return _orderItems.Where(item => item.Order == order && !item.InStock);
}
}
この例は、任意の LINQ プロバイダーで機能します。あるいは、データ プロジェクトで NHibernate のISession
andICriteria
を使用して、汚い作業を行うこともできます。