首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >域驱动设计:是否应该在存储库或应用程序级别上存在分页规范模式?

域驱动设计:是否应该在存储库或应用程序级别上存在分页规范模式?
EN

Software Engineering用户
提问于 2019-08-21 14:35:52
回答 1查看 1.8K关注 0票数 1

在领域驱动设计中,分页/分页的规范模式应该存在于存储层、应用程序层还是其他层?想看看埃里克·埃文斯( Evans )的DDD作者说了些什么。然后,我可以在正确的层实现代码。下面是示例代码。

分页意思是,示例有100个产品,并希望每20页显示5个。

Example 1: https://deviq.com/specification-pattern/

代码语言:javascript
复制
// https://github.com/dotnet-architecture/eShopOnWeb
public IEnumerable List(ISpecification spec)
{
    // fetch a Queryable that includes all expression-based includes
    var queryableResultWithIncludes = spec.Includes
        .Aggregate(_dbContext.Set().AsQueryable(),
            (current, include) => current.Include(include));

    // modify the IQueryable to include any string-based include statements
    var secondaryResult = spec.IncludeStrings
        .Aggregate(queryableResultWithIncludes,
            (current, include) => current.Include(include));

    // return the result of the query using the specification's criteria expression
    return secondaryResult
                    .Where(spec.Criteria)
                    .AsEnumerable();
}

Example 2: https://thinkbeforecoding.com/post/2009/01/19/Repositories-and-IQueryable-the-paging-case

代码语言:javascript
复制
public interface IPaged : IEnumerable
    {
        int Count { get;} 
        IEnumerable GetRange(int index, int count);
    }

public class Paged : IPaged
    {

        private readonly IQueryable source;
        public Paged(IQueryable source)
        {
            this.source = source;
        }

        public IEnumerator GetEnumerator()
        {
            return source.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }


        public int Count
        {
            get { return source.Count(); }
        }

        public IEnumerable GetRange(int index, int count)
        {
            return source.Skip(index).Take(count);
        }

    }

寻呼/分页代码

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2019-08-21 16:19:17

Paging是一个实现细节。

DDD主要关注体系结构设计;对于如何处理分页问题,它没有什么可说的,因为处理诸如纸张大小或屏幕长度这样的问题并不是业务领域的一部分,尽管它可以是设计过程的一部分。

你应该把你的寻呼放哪里?对你最方便的地方。

我看到很多文章都谈到将此责任放在存储库中,使用规范模式或其他方式过滤记录。好吧,如果你想那样工作的话。就我个人而言,我认为分页是一个显示问题,所以我希望看到它更接近UI或打印操作,也许是在ViewModel或服务层。

让存储库处理分页有其好处。如果设计正确,则可能会减少正在检索的数据量,因为分页机制将只检索每个页所需的数据,而不会检索从未打印或显示的页的数据。

票数 5
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/396308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档