Vous n'êtes certainement pas celui qui confond les choses. :-)
Je pense que la réponse à la question dépend du degré de purisme que vous voulez avoir.
Si vous voulez un point de vue strictement DDD, cela vous mènera sur une voie. Si vous considérez le référentiel comme un modèle qui nous a aidés à normaliser l'interface de la couche qui sépare les services et la base de données, vous en prendrez un autre.
De mon point de vue, le référentiel n'est qu'une couche d'accès aux données clairement spécifiée ou, en d'autres termes, un moyen normalisé de mettre en œuvre votre couche d'accès aux données. Il existe quelques différences entre les différentes implémentations de référentiel, mais le concept est le même.
Certaines personnes imposeront davantage de contraintes DDD au référentiel, tandis que d'autres utiliseront le référentiel comme un médiateur pratique entre la base de données et la couche de services. Un référentiel comme un DAL isole la couche service des spécificités de l'accès aux données.
Un problème d'implémentation qui semble les différencier est qu'un référentiel est souvent créé avec des méthodes qui prennent une spécification. Le référentiel renvoie les données qui répondent à cette spécification. La plupart des DALs traditionnels que j'ai vus, auront un ensemble plus large de méthodes où la méthode prendra un nombre quelconque de paramètres. Bien que cela puisse sembler une petite différence, c'est un gros problème lorsque vous entrez dans le domaine de Linq et des Expressions. Notre interface de référentiel par défaut ressemble à ceci :
public interface IRepository : IDisposable
{
T[] GetAll<T>();
T[] GetAll<T>(Expression<Func<T, bool>> filter);
T GetSingle<T>(Expression<Func<T, bool>> filter);
T GetSingle<T>(Expression<Func<T, bool>> filter, List<Expression<Func<T, object>>> subSelectors);
void Delete<T>(T entity);
void Add<T>(T entity);
int SaveChanges();
DbTransaction BeginTransaction();
}
S'agit-il d'un DAL ou d'un référentiel ? Dans ce cas, je pense que c'est les deux.
Kim