2009-10-04 7 views
3

j'ai lu blog about DDD from Matt PettersDDD et Référentiels usines

et selon et là, il est dit que nous créons un référentiel (interface) pour chaque entité et après que nous créons un RepositoryFactory qui va donner des exemples (Déclaré en tant qu'interfaces) de référentiels

Est-ce que c'est ainsi que le projet est fait en utilisant DDD?

je veux dire, j'ai vu des projets que je pensais qu'ils utilisent DDD mais ils appelaient chaque dépôt directement, il n'y avait pas d'usine impliqué

et aussi

pourquoi nous devons créer tant des cours du référentiel , pourquoi ne pas utiliser quelque chose comme

public interface IRepository : IDisposable 
{ 
T[] GetAll(); 
T[] GetAll(Expression<Func> filter); 
T GetSingle(Expression<Func> filter); 
T GetSingle(Expression<Func> filter, List<Expression<Func>> subSelectors); 
void Delete(T entity); 
void Add(T entity); 
int SaveChanges(); 
} 

Je suppose que cela pourrait être quelque chose avec violer les principes SOLID, ou autre chose?

Répondre

6

Il existe plusieurs façons de le faire. Il n'y a pas une seule façon de le faire. La plupart des utilisateurs préfèrent un référentiel par entité car cela leur permet de varier les services de domaine de manière plus granulaire. Cela correspond définitivement au «S» en SOLIDE.

En ce qui concerne les usines, elles ne doivent être utilisées que lorsqu'elles ajoutent de la valeur. Si tout ce qu'ils font est d'envelopper une opération new, ils n'ajoutent aucune valeur.

Voici quelques scénarios dans lesquels les usines ajoutent de la valeur:

  • usines Abtract vous permet de faire varier les implémentations du référentiel indépendamment du code client. Cela correspond bien au 'L' dans SOLID, mais vous pouvez également obtenir le même effet en utilisant DI pour injecter le Repository dans le Domain Service qui le requiert. Lorsque la création d'un objet en lui-même est une opération si complexe (c'est-à-dire qu'elle implique beaucoup plus qu'une simple création d'une nouvelle instance), elle est mieux encapsulée derrière une API.
Questions connexes