gpt4 book ai didi

java - 用领域驱动设计实现分页和排序

转载 作者:搜寻专家 更新时间:2023-11-01 03:19:27 26 4
gpt4 key购买 nike

这是关于我在领域驱动设计中实现分页和排序的解决方案,目的是不污染领域模型和存储库契约

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 值,如果可用的话将其与对数据存储的查询一起使用。

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

最佳答案

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

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

当您想要获取数据时,您通常会通过应用程序服务来完成。这些可以在将结果转换为 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/

关于java - 用领域驱动设计实现分页和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34892823/

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