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/...
Vous devez vous connecter pour publier un commentaire.
Je dirais que, comme la plupart des choses, de ses une échelle mobile. Il y a des choses que nous faisons qui ont la propriété de persistance. Sur une extrémité de l'échelle est cette chose ayant toutes les tripes, les dépendances, et le code qui est construit sur mesure persistent juste une chose dans sa manière particulière. À l'autre extrémité de l'échelle est quelque chose qui arrive comme par magie, le tout sans nous faire beaucoup plus que de l'ajout d'un jeton ou la définition d'une propriété quelque part que les causes qui chose de "juste persist'. Afin d'obtenir à la magie de l'échelle, il y a des cadres, des lignes directrices de conception, conventions, etc qui aident à la magie qui se passe. Je pense que l'on pourrait dire que l'outil pourrait être produite, qui avait moins de conditions et de restrictions que NHibernate mais poursuit le même objectif; que hypothétique outil serait plus loin le long de notre échelle.
Je ne sais pas ce que j'aime le terme "l'ignorance de la persistance' tellement; c'est vraiment à propos d'un objet d'être ignorants de la mise en œuvre, le magasin de sauvegarde, le cache, ce genre de chose - un objet est généralement conscient de si oui ou non il est persistant, cependant. Mais c'est juste de la sémantique.
Je ne crois pas que votre compréhension (ou définition) de la "Persistance de l'Ingorance" est erroné.
La réel problème est que de abstractions qui fuient. Tout simplement, la technologie existante rend très difficile à mettre en œuvre vrai PI.
Je suis d'accord avec Mikeb - "persistance de l'ignorance" est une échelle mobile, pas vrai/faux de la propriété d'un ORM.
Ma définition du vrai 100% PI serait que vous ayez pu persister TOUTE possible POCO classe, peu importe à quel point et lié à d'autres classes, sans altérer la classe en aucune façon.
Ajoutant les champs ID, la décoration avec des attributs, héritant de l'ORM classes, ayant pour la conception de vos classes, de sorte qu'ils correspondent bien aux tables sous-jacentes dans un RDB - réduire le "PI score" en dessous de 100%.
Cela dit, j'ai choisi d'utiliser Couramment NHibernate mappant automatiquement parce qu'il semble avoir le plus de PI score de toute l'ORM options que j'ai regardé.
Je serai d'accord avec votre définition:
Le code (par opposition aux attributs) dans vos classes n'a pas de caractéristiques intrinsèques à la persistance. Constructeurs par défaut peut être nécessaire pour la persistance, mais n'ont pas de code qui ne fait de la persistance. La couche de persistance pourrait être modifié assez sensiblement différentes bases de données pourraient être utilisées et la logique d'entreprise resterait inchangé.
Un persistant ignorants de la classe, est une classe qui n'est pas liée à un persistancy cadre.
C'est-à-dire, la classe n'a absolument aucune connaissance qu'il y a un persistancy cadre actuel, il n'est pas hériter d'une classe qui est défini par ce cadre ni de mettre en œuvre une interface qui est nécessaire pour que la persistance cadre pour travailler.
Alors qu'il peut y avoir certaines contraintes mineures que tout compte tenu de la persistance de l'ignorance cadre de, la persistance de l'ignorance reste néanmoins en place.
Alors qu'une classe dans votre modèle de domaine (de manière transparente persisté avec NHibernate) doit avoir un non-arguments du constructeur de sorte qu'il peut être construit "dynamique", il n'est pas nécessaire d'avoir une certaine classe de base dictées par le cadre, ni est-il nécessaire d'avoir ou de remplacer certaines cadre spécifié méthodes.
[Serializable]
attribut ou de la sérialisation de contrat de données nécessitant une[DataContract]
attribut? C'est de même une contrainte qui facilite un type de sérialisation cadre.[Serializable]
ni[DataContract]
rend-il possible pour un générique mécanisme de sérialisation de travail. Ce sont en particulier les classes de cadre particulier. Les Classes qui n'ont pas d'argument parce que les constructeurs de sérialisation tout besoin d'aucun argument constructeurs peuvent encore être sérialisation-ignorants. Mais les classes qui ont[Serializable]
attributs ne sont plus de sérialisation-ignorants, ni des classes de mise en œuvre deISerializable
.À mon avis, "l'ignorance de la persistance" est une propriété du modèle (modèle du domaine, le modèle d'entreprise ou ce que vous ne pourriez en parler comme d'). Le modèle est la persistance des ignorants, car il récupère les instances des entités qu'elle contient par des abstractions (parfois appelés référentiels). Ces abstractions peut être implemened à l'aide d'un ORM directement, mais comme vous le dites vous-même, cela peut parfois ajouter des exigences pour les objets qui n'appartiennent naturellement dans votre modèle. Donc je ne dirais pas qu'un modèle qui se conforme à certaines exigences spécifiques d'un ORM est de 100% de la persistance des ignorants.
vous pouvez mettre en œuvre persisrtence l'ignorance à l'aide d'une classe pour le domaine ou vous application et un POCO de classe dans la persistance, quand vous allez à persister le domaine objet de la carte dans votre classe de persistance et de l'utilisation de la persistance de l'objet à enregistrer avec nhibernate o autre cadre
de domaine de votre classe doit ignorer comment est conservé à l'information, de sorte que vous ne devez inclure toutes les règles d'une infrastructure de persistance comme (constructeur vide, propriétés virtuelles etc.)
ces persistance cadre de règles peut être dans votre classe de persistance.