gpt4 book ai didi

language-agnostic - 使用域模型和 POCO 类时,查询在哪里?

转载 作者:行者123 更新时间:2023-12-04 08:59:11 25 4
gpt4 key购买 nike

我是域模型、POCO 和 DDD 的新手,所以我仍在努力思考一些想法。

我还没有弄清楚的一件事是如何保持我的域模型简单且与存储无关,但仍然能够以丰富的方式对其数据执行一些查询。

例如,假设我有一个包含 OrdemItems 集合的实体 Order。无论出于何种原因,我都想获得最便宜的订单商品,或者可能是目前没有库存的订单商品 list 。我不想做的是从存储中检索所有订单项目并稍后过滤(太昂贵),所以我想最终以某种方式获得“SELECT .. WHERE ITEM.INSTOCK = FALSE”类型的数据库查询。我不想在我的实体中使用该 SQL 查询,或者任何变体是否会将我绑定(bind)到特定平台,例如 Linq2SQL 上的 NHibernate 查询。在这种情况下,常见的解决方案是什么?

最佳答案

实体是域的“单元”。存储库和服务引用它们,反之亦然。这样想:你把车管所放在口袋里吗?
OrderItem不是聚合根;它不应该通过存储库访问。它的标识是 Order 的本地标识。 , 表示 Order谈论 OrderItem 时总是在范围内s。

为查询找到家的困难使我想到了服务。在这种情况下,它们将代表 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 的 ISessionICriteria做肮脏的工作。

关于language-agnostic - 使用域模型和 POCO 类时,查询在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/521640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com