4

C'est par rapport à ma solution de mise en œuvre Paging & tri domaine Driven Conception avec l'intention de ne pas polluer les modèles de domaine et des contrats référentiel,mise en œuvre Pagination et tri avec le domaine Driven Conception

classe de base REST Demande

public class AbstractQueryRequest { 
     ... 

     private int startIndex; 
     private int offset; 

     ... 
    } 

Interceptor pour récupérer les méta-données de requête et le stocker dans un contenant 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*/); 

           } 

    } 

conteneur pour les données de requête Meta

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 


    } 

Je l'intention de récupérer cette valeur ThreadLocal dans le référentiel, si l'utilisation est disponible avec les requêtes au datastore.

J'espère que ce n'est peut-être pas une solution très sale, mais je veux savoir s'il existe un meilleur modèle largement utilisé pour cela.

+0

double possible de [Pagination à NHibernate] (http://stackoverflow.com/questions/1605368/paging-in-nhibernate) – theDmi

+1

J'espère sincèrement que ce ne soit pas le cas., ma question était plus liée à l'aspect conceptuel de DDD pour ne pas polluer le modèle de domaine avec infra (UI) souci de performance. et je voulais valider ma solution à ce problème. –

Répondre

2

n'utilisez pas votre solution. C'est assez complexe et sera difficile à déboguer et à maintenir. Si vous commencez à utiliser des méthodes asynchrones, cela ne fonctionnera même pas.

Je ne comprends pas pourquoi vous ne pouvez pas avoir de propriétés de tri/pagination dans vos méthodes de référentiel? Si vous voulez une solution plus propre, vous pouvez créer un nouvel objet qui transporte les paramètres de tri et de pagination. Lorsque vous souhaitez extraire des données, vous le faites généralement via vos services d'application. Et ceux-ci peuvent utiliser vos dépôts directement avant de convertir le résultat en DTO.

alors vous avez quelque chose comme:

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); 
    } 
} 

vous pouvez en lire plus sur le tri et la pagination dans mon article ici: http://blog.gauffin.org/2013/01/11/repository-pattern-done-right/

+0

C'était une information précieuse. Merci, je me heurte à un autre problème dans ce même domaine, l'un des concept de domaine est de rechercher un catalogue basé sur des critères donnés et de retourner la liste des résultats (paginé ofcourse). Ici, je pense à mettre en œuvre la recherche en tant que service de domaine (ai-je tort ici?). Pour ce faire, vous devez passer la pagination via le service de domaine au référentiel sous-jacent. Trouvé une application exemple qui fait charger les données de prises en pension à partir de services de domaine ... Suite ci-dessous –

+0

..Continued 'Produit suggestEquivalent (Produit problematicProduct, client du client) { \t \t Liste expiringProducts = productRepository.findProductWhereBestBeforeExpiredIn (5);' Comment est-ce que je manipule la pagination ici ?, pourvu que nous ne fassions pas passer notre inquiétude de pagination dans les modèles de domaine –