实体是域的“单元”。存储库和服务引用它们,反之亦然。这样想:你把车管所放在口袋里吗?
OrderItem
不是聚合根;它不应该通过存储库访问。它的身份对于 a 来说是本地的Order
,这意味着在谈论sOrder
时,an 总是在范围内。OrderItem
为查询找到家的困难使我想到了服务。在这种情况下,它们将代表关于an本身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
和ICriteria
做脏活。