Bien que je ne fasse pas de DDD complet, je trouve le modèle de référentiel attrayant et j'essaie de segmenter les dépôts selon les limites de l'agrégat-racine. J'implémente des dépôts au-dessus de Entity Framework, et ici ObjectContext permet un style d'unité de travail car il suit les modifications apportées aux entités et génère le SQL approprié lorsque SaveChanges est appelé.L'alignement du référentiel avec Unit of Work ou ActiveRecord est étroitement aligné
Je suis aux prises avec deux approches différentes dans mes référentiels pour savoir quand appeler SaveChanges - et la différence semble être de savoir si j'adopte une sémantique d'unité de travail ou d'enregistrement actif. Si je définir une interface référentiel pour ressembler à ceci:
public interface IRepository<T>
{
T Get(int id);
IList<T> GetAll();
IQueryable<T> Query();
void Delete(T entity);
void Add(T entity);
IUnitOfWork GetUnitOfWork();
}
et IUnitOfWork être
public interface IUnitOfWork
{
void SaveChanges();
}
Puis dans la Ajouter (entité T) mise en œuvre, il me semble avoir deux choix:
public void Add(Document entity)
{
DB.AddToDocumentSet(entity);
GetUnitOfWork().SaveChanges(); //delegates to the ObjectContext's SaveChanges
}
ou
public void Add(Document entity)
{
DB.AddToDocumentSet(entity);
}
Dans le premier cas, la méthode Add du référentiel envoie le SQL à chaque opération. Dans ce dernier cas, le code appelant est responsable de l'obtention de l'unité de travail à partir du référentiel et de l'appel de SaveChanges lorsqu'il le juge approprié. Cela permet à l'unité de travail de s'étendre sur différents référentiels (je m'assure que chaque référentiel obtient la même unité de travail dans sa construction). Mon intuition est que la deuxième approche est plus flexible. L'adoption du modèle d'unité de travail signifie également que les mises à jour des entités sont un peu plus intéressantes dans la mesure où le code appelant met simplement à jour les propriétés des entités renvoyées par les référentiels, puis appelle UnitOfWork.SaveChanges.
Lors de l'utilisation du modèle de référentiel, une approche est-elle généralement favorisée par rapport à l'autre?