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.)
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