【问题标题】:Implementing Paging and Sorting with Domain Driven Design使用领域驱动设计实现分页和排序
【发布时间】:2016-01-20 06:17:11
【问题描述】:

这是关于我在域驱动设计中实现分页和排序的解决方案为了不污染域模型和存储库合同

REST 请求的基类

    public class AbstractQueryRequest {
        ...

        private int startIndex;
        private int offset;

        ...
    }

拦截器检索查询元数据并将其存储在 ThreadLocal 容器中

    public class QueryInterceptor extends HandlerInterceptorAdapter {




        @Override
        public boolean preHandle(HttpServletRequest request,
                                 HttpServletResponse response, Object handler) throws Exception {

                                    ...

                                    QueryMetaData.instance().setPageMetaData(/*Create and set the pageable*/);

                                 }

    }

查询元数据的容器

    public class QueryMetaData {

        private static final ThreadLocal<QueryMetaData> instance = new ThreadLocal<>() {
                protected QueryMetaData initialValue() {
                    return new QueryMetaData();
                }
        };

        public static QueryMetaData instance() {
            return instance.get();
        }

        private ThreadLocal<Pageable> pageMetadata = new ThreadLocal<>();

        public void setPageMetaData(Pageable pageable) {
            pageMetadata.set(pageable);
        }

        public Pageable getPageMetaData() {
            return pageMetadata.get();
        }

        //clear threadlocal


    }

我打算在存储库中检索此 ThreadLocal 值,如果可用,将其与对数据存储区的查询一起使用。

我希望这可能不是一个非常肮脏的解决方案,但想知道是否有更好的广泛使用的模式。

【问题讨论】:

  • Paging in NHibernate的可能重复
  • 我真诚地希望它可能不是这样。我的问题更多地与 DDD 的概念方面有关,以不污染域模型与基础(UI)性能问题。并想验证我对这个问题的解决方案。

标签: java domain-driven-design ddd-repositories domain-model


【解决方案1】:

不要使用您的解决方案。它非常复杂,很难调试和维护。如果你开始使用异步方法,它甚至不会工作。

我不明白为什么您的存储库方法中不能有排序/分页属性?如果您想要一个更简洁的解决方案,您可以创建一个带有排序和分页设置的新对象。

当您想要获取数据时,通常会通过您的应用程序服务来完成。这些可以在将结果转换为 DTO 之前直接使用您的存储库。

然后你得到类似的东西:

public class YourAppService
{
    public YourAppService(ISomeRepository repos)
    {
    }

    public IList<UserDto> ListUsers(string sortColumn = "", bool ascending = true, int pageNumber = 1, pageSize = 30)
    {
        var querySettings = new QuerySettings(sortcolumn, ascending, pageNumber, pageSize);
        var users = _repos.FindAll(querySettings);
        return ConvertToDto(users);
    }
}

您可以在我的文章中阅读更多关于排序和分页的信息: http://blog.gauffin.org/2013/01/11/repository-pattern-done-right/

【讨论】:

  • 这是一些有价值的信息。谢谢,我在这方面遇到了另一个问题,域概念之一是根据给定条件搜索目录并返回结果列表(当然是分页的)。在这里,我正在考虑将搜索实现为域服务(我错了吗?)。这样做需要我通过域服务将分页传递到底层存储库。找到了一个示例应用程序,它确实从域服务中的 repo 加载数据...继续下面
  • ..Continued Product suggestEquivalent(Product problematicProduct, Client client) { List&lt;Product&gt; expiringProducts = productRepository.findProductWhereBestBeforeExpiredIn(5); 我如何在这里处理分页?前提是我们不应该将分页问题传递给域模型
猜你喜欢
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 2015-08-04
  • 2016-09-29
  • 1970-01-01
相关资源
最近更新 更多