2016-01-20 131 views
4

这是相对于我用不污染域模型意图和库合同实现分页&在域排序驱动设计的解决方案,实现分页,并与领域驱动设计

基类排序对于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的值,如果与查询到数据存储可使用它。

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

+0

[寻呼NHibernate的(可能的重复http://stackoverflow.com/questions/1605368/paging-in-nhibernate) – theDmi

+1

我真诚地希望它不会如此,我的问题更多地与DDD的概念性方面有关,从而不会污染具有基础性能(UI)性能的领域模型。并希望验证我对这个问题的解决方案。 –

回答

2

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

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

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

+0

这是一些有价值的信息。谢谢,我在这方面遇到了另一个问题,其中一个领域概念是根据给定的标准搜索一个目录并返回结果列表(分段的课程)。在这里,我正在考虑将搜索作为域服务来实现(我在这里错了吗?)。这样做需要我通过域服务将分页传递到底层存储库。发现,从域服务内从回购确实负载数据的示例应用程序...待续下面 –

+0

..Continued'产品suggestEquivalent(产品problematicProduct,客户端的客户端){ \t \t列表 expiringProducts = productRepository.findProductWhereBestBeforeExpiredIn(5);'如何我在这里处理分页吗?,前提是我们不应将分页问题转移到域模型中 –