2009-11-03 5 views
6

Je suis confus. Ceci est une entrée de blog de Ayende Rahien Repository is the new singleton. Je crois qu'un référentiel ne devrait faire que des opérations CRUD et non des requêtes supplémentaires, sinon vous finirez avec des méthodes comme celles-ci sur votre dépôt.Modèle DDD Repositories avec NHibernate

  1. FindCustomer (id)
  2. FindCustomerWithAddresses (id)
  3. FindCustomerWith ..

Donc ma question est, où (dans quelle couche) ferait-on les requêtes pour récupérer des entités?

+0

Deux messages utiles sur le sujet: par [Jimmy Bogard] (http://www.lostechies.com/blogs/jimmy_bogard /archive/2009/09/02/ddd-repository-implementation-patterns.aspx) et par [Greg Young] (http://codebetter.com/blogs/gregyoung/archive/2009/01/16/ddd-the- generic-repository.aspx). Je gravite vers une approche hybride: des référentiels génériques pour des actions simples et des objets de requête pour des plus complexes. Je n'expose généralement pas les référentiels à tout ce qui utilise ma logique (interface utilisateur, service), mais offre des fonctionnalités dans un modèle de type service/façade, de sorte que l'approche double n'est pas exposée en dehors de cette couche de façade. – tijmenvdk

Répondre

3

Il est possible d'écrire dans le référentiel avec des opérations CRUD par défaut. Par exemple:

public interface IRepository<TEntity> 
{ 
    TEntity FindByIdentity(object identity); 
    TEntity FindBy(Expression<Func<TEntity, bool>> specification); 
    IList<TEntity> FindAll(); 
    IList<TEntity> FindAllBy(Expression<Func<TEntity, bool>> specification); 
    TEntity Save(TEntity saveable); 
    void Delete(TEntity deletable); 
} 

Expression> est fondamentalement Spécification et les requêtes peuvent être encapsulent de cette façon. Si nous avons ce type de référentiel alors nous n'avons pas besoin d'écrire beaucoup de dépôts spécifiques.

Le chemin alternatif est créer Query objet. Nous pourrions ajouter l'interface de cette requête à la couche Logique Core/Busines et l'implémentation à la couche Services/Données. De cette façon, nous avons joliment nommé des requêtes comme AllPreferredCustomersQuery. C'est assez similaire aux spécifications, mais les spécifications n'utilisent pas l'infrastructure et nous pouvons donc l'ajouter à la couche logique de base/métier. Query Les objets sont plus configurables (par exemple, possibilité d'ajouter des limites, récupérer des stratégies, des jointures, etc.)

Questions connexes