加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

语言无关 – 在使用域模型和POCO类时,查询在哪里?

发布时间:2020-12-13 20:12:18 所属栏目:百科 来源:网络整理
导读:我是领域模型,POCO和DDD的新手,所以我仍然试图了解一些想法. 我无法弄清楚的一件事是如何保持我的域模型简单且与存储无关,但仍然能够以丰富的方式对其数据执行某些查询. 例如,假设我有一个具有OrdemItem集合的实体Order.无论出于何种原因,我想获得最便宜的订
我是领域模型,POCO和DDD的新手,所以我仍然试图了解一些想法.

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

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

实体是域的“单元”.存储库和服务引用它们,反之亦然.这样想一想:你把DMV放在口袋里吗?

OrderItem不是聚合根;它不应该通过存储库访问.它的标识是订单的本地标识,这意味着在谈论OrderItem时订单将始终在范围内.

为查询找到住所的难度让我想到了服务.在这种情况下,他们会代表一个订单本身很难知道的订单.

在域项目中声明intent:

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来完成脏工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读