Pregunta

Persistencia la ignorancia suele definirse como la capacidad de persistir y recuperar objetos .NET estándar (o POCOs si realmente insisten en darles un nombre). Y una aparentemente bien aceptada definición de un objeto .NET estándar es :

  

"... las clases ordinarias en el que se centran en el problema de negocio a la mano sin añadir cosas por razones relacionadas con la infraestructura ..."

Sin embargo, veo a la gente que describen NHibernate como un marco que permite la persistencia ignorancia, y sin embargo es un marco que no pueden trabajar en cualquier objeto .NET norma, sólo se .NET objetos estándar que se adhieren a particular, los requisitos de diseño, por ejemplo ( fuente ):

  • Todas las clases debe tiene un constructor
  • predeterminado
  • Algunas características no funcionan a menos que son abiertos clases y todos los miembros son virtuales
  • identidad de objetos no funciona correctamente a menos que se abusa es igual a / GetHashCode
  

(Aparte: Antes de que nadie se molesta, no me refiero a recoger en NHibernate aquí, es sólo un ejemplo citado con frecuencia de un marco que supuestamente permite la persistencia ignorancia Estoy seguro de argumentos similares podrían aplicarse a. otros ORM que dicen lo mismo).

Ahora bien, aunque la clase en sí mismo no tiene ningún atributo persistencia-marco-específicos o clases de base, etc., para mí no es realmente "persistencia ignorantes" porque debe seguir una serie de pautas de diseño a facilitar su uso por el framework de persistencia elegido. Debe diseñar e implementar la clase con los requisitos del marco de la persistencia en la mente; Si eres ignorante de que la clase no puede trabajar con él.

¿Dónde estoy teniendo problemas con la definición de "ignorancia de la persistencia" / "poco" es que no veo cómo, conceptualmente, esto es muy diferente a la adición de atributos tales como [Serializable] o [DataContract] o [XmlType] o cualquier otro anotaciones persistencia-marco-específicas que facilitan la persistencia y la recuperación de la entidad que utiliza ese marco.

Así que, ¿qué es exactamente "ignorancia de la persistencia"?

Es evidente que la definición de la misma como ser capaz de persistir "clases ordinarias" es una falacia porque los NHibernate son sólo en la medida ordinaria de no hacer referencia a las clases marco específicos, mientras que son en la medida extraordinaria, ya que requieren opciones de diseño inusuales, tales como predeterminado constructores y todos los miembros virtuales y es igual a / implementaciones GetHashCode sobre tipos mutables.

Es por lo tanto razonable decir que "la ignorancia de persistencia" es cierto cuando los objetos facilitan el uso de un framework de persistencia (ya sea en el diseño y la estructura o por medio de anotaciones-marco específico), pero no realice ninguna lógica de persistencia sí mismos?

¿Fue útil?

Solución

Yo afirmaría que, como la mayoría de las cosas, es una escala móvil. Hay cosas que hacemos que quieren tener la propiedad de persistencia. En un extremo de la escala es esta cosa que tenga todas las entrañas, dependencias, y el código que se construye a medida que persista esta única cosa en su manera particular. En el otro extremo de la escala es algo que sucede por arte de magia, todo sin hacer mucho más que la adición de una ficha o el establecimiento de una propiedad que en algún causas que lo que 'sólo persisten'. Con el fin de llegar a la parte mágica de la escala, hay marcos, las directrices de diseño, convenciones, etc que ayudan a la magia en el devenir. Creo que se podría argumentar que una herramienta puede ser producida que tenía un menor número de requisitos y restricciones que NHibernate pero perseguido el mismo objetivo; esa herramienta hipotética sería aún más a lo largo de nuestra escala.

No sé que me gusta el término 'persistencia ignorancia' tanto; es realmente acerca de un objeto ignorando la implementación, el almacén de respaldo, la memoria caché, ese tipo de cosas - un objeto es generalmente consciente de si es o no es persistente, sin embargo. Pero eso es sólo semántica.

Otros consejos

No creo su comprensión (o definición) de la "Persistencia Ingorance" es erróneo.

La real tema es el de fugas abstracciones . En pocas palabras, la tecnología existente hace que sea muy difícil de aplicar cierto PI.

Estoy de acuerdo con mikeb - "ignorancia persistencia" es una escala móvil, no una verdadera falsa propiedad / ORM de un determinado

.

Mi definición de la verdadera 100% PI sería que usted podría persistir cualquier posible POCO clase, no importa cuán enrevesada y vinculado a otras clases, sin cambiar de otro modo la clase de ninguna manera.

La adición de campos de ID, la decoración con atributos, herencia de clases ORM, tener que diseñar sus clases para que se asignan también a las tablas subyacentes en una RDB -. Todo Reducir la "puntuación de PI" por debajo del 100%

Una vez dicho esto, he optado por utilizar Fluido NHibernate Automapping ya que parece tener la mayor puntuación PI de cualquiera de las opciones de ORM que he mirado.

Yo estaría de acuerdo con su definición:

  

Es por lo tanto razonable decir que   "Ignorancia de la persistencia" es cierto cuando   objetos facilitan el uso de una   framework de persistencia, pero no lo hacen   realizar cualquier lógica de persistencia   ellos mismos?

El código (en contraposición a los atributos) en sus clases no tiene características que son intrínsecos a la persistencia. constructores por defecto podrían ser necesarios para la persistencia, pero no tienen ningún código que realmente hace la persistencia. La capa de persistencia puede ser cambiado de forma sustancial, diferentes bases de datos podrían ser utilizados y la lógica de negocio permanecería sin cambios.

Una clase ignorante persistente, es una clase que no está vinculada a un marco persistancy.

Es decir, la clase no tiene absolutamente ningún conocimiento de que hay un marco persistancy la actualidad, no se hereda de una clase que se define en dicho marco ni implementar una interfaz que se requiere para que el marco de persistencia con el fin de trabajo.

Si bien puede haber ciertas restricciones menores que cualquier marco persistencia-ignorancia dada requiere, la persistencia, la ignorancia, sin embargo, permanece en su lugar.

Mientras que una clase en su modelo de dominio (transparente persistido con NHibernate) debe tener un no-argumentos de constructor de manera que se puede construir "dinámica", no es necesario tener una cierta clase base dictado por el marco ni es requiere tener o anular ciertos métodos marco-especificado.

En mi opinión, la "persistencia ignorancia" es una propiedad de su modelo (modelo de dominio, modelo de negocio o cualquier cosa que pueda referirse a ella como). El modelo es la persistencia ignorante porque recupera instancias de las entidades que contiene a través de abstracciones (a veces referido como repositorios). Estas abstracciones pueden se implemened directamente mediante el uso de un ORM, pero como usted afirma a sí mismo esto a veces pueden añadir requisitos a los objetos que, naturalmente, no pertenecen en su modelo. Por tanto, yo no diría que un modelo que se adhiere a algunos requisitos de un ORM específica es 100% persistencia ignorante.

Puede aplicar la ignorancia persisrtence usando una clase para el dominio o aplicación y una clase POCO en la persistencia, cuando se va a conservar el objeto de dominio mapear en su clase de persistencia y utilizar la persistencia de objetos a la tienda con nhibernate o otro marco

su dominio de clase debe ignorar cómo se persistió la información, por lo que no debe incluir ningún reglas de un framework de persistencia como (constructor vacío, propiedades virtuales, etc.)

marco jurídico de este persistencia puede estar en su clase de persistencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top