web-dev-qa-db-fra.com

DDD - Modèle de persistance et modèle de domaine

J'essaie d'apprendre la conception axée sur le domaine (DDD) et je pense que j'ai compris l'idée de base. Mais il y a quelque chose qui me trouble.

Dans DDD, le modèle de persistance et le modèle de domaine sont-ils différents? Je veux dire, nous concevons notre domaine et nos classes avec uniquement des préoccupations de domaine; c'est bon. Mais ensuite, lorsque nous construisons nos référentiels ou tout autre système de persistance des données, devrions-nous créer une autre représentation de notre modèle à utiliser dans la couche de persistance?

Je pensais que notre modèle de domaine est également utilisé en persistance, ce qui signifie que nos référentiels renvoient nos objets de domaine à partir de requêtes. Mais aujourd'hui, j'ai lu ce post, et je suis un peu confus:

Arrête ça! Le modèle de domaine n'est pas le modèle de persistance

Si cela est vrai, quel serait l'avantage d'avoir des objets de persistance distincts des objets de domaine?

46
ayk

Imaginez-vous de cette façon, le modèle de domaine ne devrait dépendre de rien et ne devrait contenir aucun code d’infrastructure. Le modèle de domaine ne doit pas être sérialisable ni hériter de certains objets ORM, ni même les partager. Toutes ces préoccupations concernent l’infrastructure et doivent être définies séparément du modèle de domaine.

Mais si vous recherchez le DDD pur et que votre projet valorise l'évolutivité et les performances sur la vitesse de développement initiale. Plusieurs fois, le fait de combiner les problèmes d'infrastructure avec votre "modèle de domaine" peut vous aider à réaliser de grandes avancées en termes de rapidité, au détriment de l'évolutivité. Le fait est que vous devez vous demander: "Les avantages du DDD pur en valent-ils le coût en termes de rapidité de développement?". Si votre réponse est oui, alors voici la réponse à votre question.

Commençons par un exemple où votre application commence par un modèle de domaine et il se trouve que les tables de la base de données correspondent exactement à votre modèle de domaine. Désormais, votre application évolue à pas de géant et vous commencez à rencontrer des problèmes de performances lors de l'interrogation de la base de données. Vous avez appliqué quelques index bien pensés, mais vos tables grandissent si rapidement qu'il semble nécessaire de dénormaliser votre base de données pour rester à la hauteur. Ainsi, avec l'aide d'un dba, vous créez une nouvelle conception de base de données qui gérera vos besoins en performances, mais maintenant, les tables sont très différentes de ce qu'elles étaient auparavant et des fragments de vos entités de domaine sont désormais répartis sur plusieurs tables. que ce soit une table pour chaque entité. 

Ce n'est qu'un exemple, mais cela montre pourquoi votre modèle de domaine doit être séparé de votre modèle de persistance. Dans cet exemple, vous ne souhaitez pas diviser les classes de votre modèle de domaine pour qu'elles correspondent aux modifications que vous avez apportées à la conception du modèle de persistance et changent essentiellement la signification de votre modèle de domaine. Au lieu de cela, vous souhaitez modifier le mappage entre votre nouveau modèle de persistance et le modèle de domaine.

Garder ces conceptions séparées présente plusieurs avantages, tels que l'évolutivité, les performances et le temps de réaction aux modifications de base de données urgentes, mais vous devez les comparer au coût et à la rapidité du développement initial. En règle générale, les projets qui bénéficieront le plus de ce niveau de séparation sont les applications d'entreprise à grande échelle.

MISE À JOUR POUR LES COMMENTATEURS

Dans le monde du développement logiciel, il existe un nième nombre de solutions possibles. De ce fait, il existe une relation inverse indirecte entre la flexibilité et la vitesse initiale de développement. Par exemple, je pourrais coder en dur la logique dans une classe ou écrire une classe qui permette de lui transmettre des règles de logique dynamique. La première option aurait un rythme de développement plus rapide, mais au prix d’une moindre flexibilité. Cette dernière option aurait un degré de flexibilité plus élevé, mais au détriment d’un ralentissement du développement. Ceci est vrai dans tous les langages de codage car il y a toujours un nième nombre de solutions possibles.

De nombreux outils sont disponibles pour vous aider à augmenter votre vitesse de développement initiale et votre flexibilité. Par exemple, un outil ORM peut augmenter la vitesse de développement du code d'accès à votre base de données tout en vous offrant la possibilité de choisir les implémentations de base de données spécifiques prises en charge par ORM. De votre point de vue, il s’agit d’un gain net de temps et de flexibilité moins le coût de l’outil (dont certains sont gratuits) qui peut en valoir la peine en fonction du coût du temps de développement par rapport à la valeur de la besoin d'affaires. 

Toutefois, pour cette conversation dans les styles de codage, qui est essentiellement ce que la conception dirigée par le domaine est, vous devez prendre en compte le temps qu'il a fallu pour écrire l'outil que vous utilisez. Si vous deviez écrire cet outil ORM ou même écrire votre logique d'accès à la base de données de manière à prendre en charge toutes les implémentations que cet outil vous donne, cela prendrait beaucoup plus de temps que si vous deviez simplement coder en dur l'implémentation spécifique que vous planifiez. sur l'utilisation.

En résumé, les outils peuvent vous aider à réduire votre temps de production et votre flexibilité, souvent en distribuant le coût de ce temps à tous ceux qui achètent l'outil. Cependant, tout code, y compris celui qui utilise un outil, restera affecté par la relation vitesse/flexibilité. De cette manière, la conception pilotée par le domaine offre une plus grande flexibilité que si vous mêliez votre logique métier, votre accès à la base de données, votre accès au service et le code de l'interface utilisateur, mais au prix de la production. Domain Driven Design sert mieux les applications de niveau entreprise que les petites applications car les applications de niveau entreprise ont généralement un coût plus élevé en termes de temps de développement par rapport à la valeur métier et parce qu'elles sont plus complexes, elles sont également plus sujettes aux changements nécessitant une plus grande flexibilité. coût réduit dans le temps.

54
Aaron Hawkins

Dans DDD, modèle de persistance et modèle de domaine sont-ils différents?

Oui, mais cela n'implique pas nécessairement un ensemble de classes différent pour représenter explicitement le modèle de persistance. 

Si vous utilisez une base de données relationnelle pour la persistance, un ORM tel que NHibernate peut prendre en charge la représentation du modèle de persistance par le biais de mappages sur des classes de domaine. Dans ce cas, il n'y a pas de classe de modèle de persistance explicite. Le succès de cette approche dépend des capacités de cartographie de l’ORM. NHibernate, par exemple, peut prendre en charge une classe de mappage intermédiaire via mappages de composants . Cela permet d'utiliser une classe de modèle de persistance explicite lorsque le besoin s'en fait sentir.

Si vous utilisez une base de données de documents à des fins de persistance, un modèle de persistance est généralement encore moins nécessaire, car le modèle de domaine doit uniquement être sérialisable pour pouvoir être conservé. 

Par conséquent, utilisez une classe de modèle de persistance explicite lorsqu'il existe un mappage complexe qui ne peut pas être atteint avec les mappages ORM vers le modèle de domaine. La différence entre le modèle de domaine et le modèle de persistance demeure quelle que soit la mise en œuvre.

13
eulerfx

Dans DDD, modèle de persistance et modèle de domaine sont-ils différents?

Dans DDD, vous avez le modèle domain et le repository. C'est tout. Si vous vous trouvez dans le référentiel, vous persistez directement dans votre modèle de domaine ou vous le convertissez en un modèle de persistance avant de le conserver. C'est une question de design, votre design. 

Comme d'autres réponses l'ont souligné, chaque option a ses avantages et ses inconvénients. Jetez un oeil à cette réponse où je détaille certaines d’entre elles.

9
fabriciorissetto

Votre modèle de domaine est différent de votre modèle de persistance, et cela n’est pas grave. 

Laisse-moi expliquer. 

Supposons que vous utilisiez une base de données relationnelle comme magasin de persistance, que vous utilisiez probablement un ORM et que vous choisissiez un ORM par rapport à d'autres, ce qui aurait un impact important si vous aviez besoin ou non de modèles de persistance. 

Comment venir ? 

Comparons 2 ORM, les plus utilisés dans le monde .NET.

1ère structure d'entité

Le code suivant est nécessaire pour comprendre la relation. 

public class Aggregate
{
    public int Id { get; }

    /// relation
    protected internal virtual IList<Entity> Model { get; private set; }
} 


public class Entity
{
    public int Id { get; }

    /// relation
    public int AggId{ get; private set;}
    public Aggregate Aggregate { get; private set; }
} 

Examinons maintenant NHibernate et c’est ainsi que nous modélisons nos modèles de domaine.

public class Aggregate
{
    public virtual int Id { get; }

    protected internal virtual IList<Entity> Model { get; private set; }
} 

public class Entity
{
    public virtual int Id { get; }
} 

Alors, remarquez la différence dans la manière dont nous modélisons l’un et l’autre.

Parlons de quel est le problème avec EF. De mon point de vue, deux violations de domaine très importantes se produisent ici.

1er Comme vous pouvez le constater, EF nécessite des références croisées pour savoir comment modéliser le schéma de base de données. De plus, si vous allez avoir une relation plusieurs à plusieurs à un moment donné, vous devrez non seulement ajouter les références dans les deux modèles de domaine, mais vous devrez également ajouter une 3e classe (une classe de jonction) que vous n'aurez pas. idée comment le modéliser en tant que concept de domaine, s'agit-il d'un agrégat, d'une entité ou d'un ValueObject? En réalité, cela n’a aucune valeur pour votre entreprise, alors pourquoi devriez-vous être obligé de la modeler? Votre domaine ne doit s’occuper que des besoins de l’entreprise et non de la façon dont les données doivent être représentées par rapport au stockage.

2ème. voir ceci http://www.informit.com/articles/article.aspx?p=2020371&seqNum=4

Que peux-tu y faire ? Si vous utilisez EF, vous obtiendrez probablement des modèles de domaine (qui ressembleront dans ce cas à des modèles NHibernate) et des modèles de persistance, qui seront des miroirs du schéma de base de données. Les modèles de domaine se trouvent dans votre domaine et votre modèle de persistance dans votre infrastructure. 

Revenons maintenant à NHibernate. Vous pouvez considérer que votre modèle de domaine est identique à votre modèle de données. Bien entendu, vous utiliserez certaines configurations dans l'infrastructure afin de modéliser les relations correctes avec le magasin de persistance, mais NHibernate ne vous obligera pas à ajouter quoi que ce soit dans votre domaine. tu n'as pas besoin. 

Je ne fais la promotion d'aucun ORM par rapport à un autre, le choix de chacun consiste à en utiliser, choix qui devrait être dicté par les besoins de votre entreprise. 

Maintenant, qu'en est-il de NoSQL (sans schéma)? votre modèle de domaine est identique à votre modèle de persistance, plus vous n'aurez besoin d'aucune configuration pour modéliser aucune relation 

0
MCR