31 votes

Quels sont les avantages de la Persistance de l'Ignorance?

Je suis un newbie dans le DDD+TDD Monde. Mais j'ai été dans la programmation depuis presque 9 ans.

Quelqu'un peut-il svp m'expliquer les avantages de la persistance ignornace ? Typique nHibernate application pousse juste la dépendance entre la classe et la base de données de fichiers de mappage.

Si je change de Catégorie fichiers ou de Base de données, j'ai du modifier les fichiers de mappage. Ainsi n'est-il pas juste de pousser la dépendance en ajoutant encore une couche d'abstraction? Dans mon avis jusqu'à présent, je ne pense pas que c'est quelque chose de révolutionnaire. Mais je ne suis pas sûr si je suis absent quelque chose.

Enfin, Comment puis-je tester les fichiers de mapping ? Il ya des chances de bugs apparaissent à partir des fichiers de mappage, comment puis-je tester?

41voto

Stefan Steinegger Points 37073

Laissez-moi vous expliquer avec un exemple. Supposons que votre sont la mise en œuvre d'une application à l'aide d'un classique SQL approche. Vous ouvrez les jeux d'enregistrements, de modifier des données et de la commettre.

Le Pseudo-code:

trx = connection.CreateTransaction();
query = connection.CreateQuery("Select * from Employee where id = empid");
resultset = query.Run();
resultset.SetValue("Address_Street", "Bahnhofstrasse");
resultset.SetValue("Address_City", "Zürich");
trx.Commit();

Avec NHibernate il ressemblerait à quelque chose comme ceci:

emp = session.Get<Employee>(empid);

// persistence ignorant 'logic'
emp.Address.Street = "Bahnhofstrasse";
emp.Address.City = "Zürich";

session.Commit();

L'Ignorance de la persistance signifie que la logique d'entreprise lui-même ne sait pas à propos de la persistance. Ou en d'autres termes, la persévérance est séparée de la logique. Cela le rend beaucoup plus réutilisable.

Déplacer la 'logique' de réutilisables méthode:

void MoveToZuerichBahnhofstrasse(Employee emp)
{
  // doesn't have anything to do with persistence
  emp.Address.Street = "Bahnhofstrasse";
  emp.Address.City = "Zürich";
}

Essayez d'écrire une telle méthode à l'aide de jeux de résultats et vous savez ce que l'ignorance de la persistance est.

Si vous n'êtes pas convaincu, voir comment une simple unité de test, car il n'y a pas toutes les dépendances liées à la persistance des trucs:

Employee emp = new Employee();
MovingService.MoveToZuerichBahnhofstreasse(emp);
Assert.AreEqual("Bahnhofstrasse", emp.Address.Street);
Assert.AreEqual("Zürich", emp.Address.City);

DDD est quelque chose de différent. Il vous construisez votre domaine premier modèle (modèle de classe) et de créer la base de données de conception selon elle. Avec NH c'est très simple, parce que - grâce à l'ignorance de la persistance - vous pouvez écrire et de l'unité de tester le modèle et la logique avant d'avoir un (définitive) modèle de base de données.


Test: Nous testons les mappages par la création d'une instance de l'entité, de le stocker dans la base de données, le récupérer et de le comparer. Ceci est fait automatiquement avec beaucoup de réflexion. Mais vous n'avez pas besoin d'aller si loin. la plupart des erreurs typiques afficher lorsque vous tentez de stocker une entité.

On pourrait faire la même avec des requêtes. Des requêtes complexes méritent un test. C'est plus intéressant si la requête est compilé à tous. Vous n'avez même pas besoin de données pour cela.

Pour la base de données de tests d'intégration, nous sommes en utilisant Sqlite. C'est assez rapide. NH produit de la base de données en mémoire à la volée à l'aide de SchemaExport (avant chaque test).

6voto

Praveen Angyan Points 6232

J'ai toujours pensé en terme de domaine et tout, j'ai utilisé des procédures stockées, ADO.NET dans le passé, c'est seulement quand je suis enfin passé à NHibernate que j'ai été satisfait de mon mécanisme de persistance.

Domain Driven Design (DDD) met l'accent est mis sur le modèle de domaine. Cela signifie que l'objectif principal est la création d'un modèle conceptuel qui constitue un langage commun pour les utilisateurs et les programmeurs. Les utilisateurs ne sont presque JAMAIS intéressé à la façon dont vous êtes la persistance de leurs informations. NHibernate vous aide à atteindre cet état d'esprit en faisant de la persistance d'une préoccupation secondaire pour la capture des règles d'affaires et la compréhension de ce que l'utilisateur veut vraiment du système.

NHibernate Fluent permet de réduire l'impact que les modifications apportées à votre modèle de domaine sur le sous-jacent des fichiers de mappage. Il dispose également de mappage automatique. Bien que vous ne pouvez jamais totalement ignorer la persistance pour votre système, NHibernate avec NHibernate Fluent permet de vous concentrer sur le modèle du domaine. Si vous n'êtes pas en se concentrant sur l'utilisation d'un riche modèle de Domaine, il y a peu d'avantages à NHibernate.

En ce qui concerne le test de vos mappages, vous auriez du écrire des tests (ou DEVRAIT être) peu importe la méthode que vous utilisez pour mettre en œuvre la persistance. Ce n'est pas du travail supplémentaire qui s'affiche juste parce que vous êtes à l'aide de NHibernate. Il suffit de penser de tester vos correspondances des tests de persistance fonctionne correctement.

Une fois de plus de parler Couramment NHibernate est inestimable. Il a une Persistance Tests de Spécification qui est vraiment simple à utiliser pour la plupart des cas.

2voto

Arnis L. Points 18316

PI n'est pas sur l'utilisation de NHibernate. PI représente en ignorant la façon dont les données seront stockées développement du modèle de domaine. Et oui, c'est en poussant la dépendance en ajoutant encore une couche d'abstraction. DDD n'est pas révolutionnaire - c'est plus comme une idée, une approche comment de code utilisant déjà des motifs familiers (la plupart d'entre eux sont). I. e. - modèle de fabrique ou motif de module n'est pas trop, mais assez importante partie de DDD.

J'ai commencé à utiliser NHibernate tout récemment aussi, donc - ne peut pas fournir plus de détails à ce sujet. Mais j'en ai trouvé une astuce qui peut être utile pour Vous - essayez Couramment NHibernate si vous ne l'avez pas déjà fait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X