Je me plonge dans Domain Driven Design et certains des concepts que je découvre ont beaucoup de sens en surface, mais lorsque j'y réfléchis davantage, je me demande si c'est vraiment une bonne idée.
Le concept d'agrégats, par exemple, a du sens. Vous créez de petits domaines de propriété afin que vous n'ayez pas à traiter avec le modèle de domaine entier.
Toutefois, lorsque j'y pense dans le contexte d'une application Web, nous consultons fréquemment la base de données pour récupérer de petits sous-ensembles de données. Par exemple, une page peut ne lister que le nombre de commandes, avec des liens sur lesquels cliquer pour ouvrir la commande et voir son identifiant.
Si je ne me trompe pas Agrégats compréhension, je généralement utiliser le modèle référentiel pour retourner un OrderAggregate qui contiendrait les membres GetAll
, GetByID
, Delete
et Save
. Ok, ça sonne bien. Mais...
Si j'appelle GetAll pour répertorier toutes mes commandes, il me semblerait que ce schéma exigerait le renvoi de la liste complète des informations globales, des commandes complètes, des lignes de commande, etc. Lorsque je n'ai besoin que d'un petit sous-ensemble de ces informations (informations d'en-tête seulement).
Est-ce que je manque quelque chose? Ou y a-t-il un niveau d'optimisation que vous utiliseriez ici? Je ne peux pas imaginer que quiconque puisse préconiser de renvoyer des agrégats complets lorsque vous n'en avez pas besoin.
Certes, vous pouvez créer des méthodes sur votre référentiel GetOrderHeaders
, mais cela semble aller à l’encontre du but qui consiste à utiliser un modèle tel que référentiel.
Quelqu'un peut-il clarifier cela pour moi?
MODIFIER:
Après de nombreuses recherches, je pense que le point négatif est qu'un modèle de référentiel pur diffère de ce que la plupart des gens pensent d'un référentiel.
Fowler définit un référentiel comme un magasin de données qui utilise la sémantique de la collection et est généralement conservé en mémoire. Cela signifie créer un graphe d'objet entier.
Evans modifie le référentiel pour inclure les racines d'agrégat. Le référentiel est donc amputé pour ne prendre en charge que les objets d'un agrégat.
La plupart des gens semblent penser que les référentiels sont des objets d'accès aux données glorifiés, dans lesquels vous créez simplement des méthodes pour obtenir toutes les données que vous souhaitez. Cela ne semble pas être l'intention telle que décrite dans Patterns of Enterprise Application Architecture de Fowler.
D'autres encore considèrent un référentiel comme une simple abstraction utilisée principalement pour faciliter les tests et les moqueries, ou pour dissocier la persistance du reste du système.
Je suppose que la réponse est qu'il s'agit d'un concept beaucoup plus complexe que je ne le pensais au départ.