Quel est exactement “la persistance de l'ignorance”?

L'ignorance de la persistance est généralement définie comme la capacité à persister & récupérer standard .NET les objets (ou POCOs si vraiment vous insistez sur le fait de donner un nom). Et un apparemment bien acceptée définition d'une norme .NET objet est:

"...les classes ordinaires où vous vous concentrez sur le problème de l'entreprise à portée de main sans ajouter des trucs pour les infrastructures liées à des raisons..."

Cependant, je vois des gens décrivant NHibernate comme un cadre qui permet à l'ignorance de la persistance, et pourtant, c'est un cadre qui ne peuvent pas travailler sur tout standard .NET objet, une seule norme .NET les objets qui respectent notamment les exigences de conception, par exemple (source):

  • Toutes les classes doit avoir un constructeur par défaut
  • Certaines fonctionnalités ne fonctionnent pas à moins que les classes sont scellés et tous les membres sont virtuels
  • L'identité de l'objet ne fonctionne pas correctement si l'abus est Égal à/GetHashCode

(Côté: Avant que quelqu'un s'énerve, je ne veux pas prendre sur NHibernate ici, c'est juste l'un des plus fréquemment citée en exemple d'un cadre qui est censé être permis de l'ignorance de la persistance. Je suis sûr que des arguments similaires peuvent être appliquées à d'autres Orm qui prétendent la même chose.)

Maintenant, bien que la classe en elle-même n'a pas de persistance-cadre spécifique des attributs ou des classes de base, etc., pour moi, il n'est pas vraiment "la persistance des ignorants", car il doit suivre un ensemble de lignes directrices de conception pour faciliter utilisation, par l'infrastructure de persistance. Vous devez concevoir et de mettre en œuvre la classe avec les exigences de la persistance de cadre à l'esprit; si vous êtes ignorants de la classe ne peut pas travailler avec elle.

Où je vais avoir des problèmes avec la définition de "l'ignorance de la persistance"/"POCO", c'est que je ne vois pas comment, sur le plan conceptuel, c'est vraiment différent de l'ajout d'attributs tels que [Serializable] ou [DataContract] ou [XmlType] ou de tout autre persistance-cadre-des annotations spécifiques que faciliter la persistance et la récupération de l'entité à l'aide de ce cadre.

Alors, quelle est exactement la "persistance de l'ignorance"?

Clairement la définition de celui-ci comme étant capables de persister "les classes ordinaires" est une erreur car le NHibernate n'ordinaire dans la mesure où pas référence à un cadre spécifique des classes, alors qu'ils sont extraordinaires dans la mesure où ils nécessitent une conception inhabituelle de choix tels que les constructeurs par défaut et tous les membres virtuels et est Égal à/GetHashCode implémentations sur mutable types.

Est-il donc raisonnable de dire que "l'ignorance de la persistance" est vraie lorsque les objets de faciliter l'utilisation d'une infrastructure de persistance (que ce soit dans la conception et la structure ou par utilisation d'un cadre spécifique des annotations), mais ne pas effectuer toute persistance de la logique d'eux-mêmes?

  • À ne pas confondre avec "Persistant de l'Ignorance" - dont environ décrit certaines personnes que je connais 😉
  • Comment devrait-l'identité de l'objet de travail sans égale/gethashcode? Pouvez-vous donner un exemple en pseudo code?
  • Quelqu'un y pense vraiment que NHibernate (ou tout autre ORM) est un 100% PI de solution? L' (intéressant) le cœur de la question est vraiment "qui PI compromis plus interférer avec le domaine modèle de développement?"
  • c'EST une question plus intéressante - vous devriez probablement demander ça ;-). Par exemple, je serais probablement valoir que l'ajout d'attributs de classes du domaine est de moins d'un compromis de PI que l'ajout de classes purement pour faire de l'ORM heureux (que j'ai eu à faire avec la FNH).
  • Aee aussi: stackoverflow.com/questions/905498/...
InformationsquelleAutor Greg Beech | 2009-12-29