¿Los objetos ignorantes de persistencia pueden implementar la carga diferida?

12

La ignorancia de persistencia es una aplicación del principio de responsabilidad única, que en la práctica significa que los Objetos de dominio ( DO ) no deberían contener código relacionado con la persistencia, sino que solo deberían contener lógica de dominio.

a) Supongo que esto significa que el código que contacta con las capas inferiores (es decir, las capas de persistencia) vive fuera del modelo de dominio en otras clases ( OC ) de una capa de lógica de negocios.

b) Si mi suposición bajo a) es correcta, entonces DO , por ejemplo Customer, no contiene métodos tales como GetCustomerso GetCustomerByID?

c) Si mis suposiciones bajo a) y b) son correctos, y suponiendo Customerobjeto de dominio usa la carga diferida para algunas de sus propiedades, a continuación, en algún momento Customer's interna lógica debe comunicarse con OC , que a su vez recupera DEFFERED datos. Pero si Customernecesita ponerse en contacto con OC para recibir datos diferidos, ¿entonces no podemos afirmar que los objetos de dominio no contienen lógica relacionada con la persistencia?

Gracias

RESPONDIENDO A jkohlhepp

1) Supongo OrderProvidery las CustomerProviderclases están contenidas dentro de la capa de lógica de negocios

2) ¿De su respuesta deduzco que mis suposiciones en b) son correctas?

3)

... Comprobaría si algún campo de órdenes privadas estaba lleno o si era nulo. Si es nulo ...

Pero, por lo que puedo decir, tan pronto como el código de dominio necesite verificar si orderse rellenó el campo privado , y si no es así, contactando a OrderProvider, ¡¿ya estamos violando el principio PI ?!

usuario1483278
fuente

Respuestas:

4

Creo que tienes razón en tus supuestos A y B sobre la ignorancia de persistencia.

La mejor manera de lograr la carga diferida de los objetos de la base de datos depende en gran medida de su problema e implementación particulares. Sin embargo, intentaré una respuesta genérica sobre cómo hacer una carga diferida mientras mantengo la separación de las preocupaciones entre las clases de persistencia y lógica de dominio.

Tiendo a implementar la ignorancia de persistencia usando las siguientes clases:

  • Clases de dominio - por ejemplo, Cliente
  • Proveedor / clases de repositorio - por ejemplo, CustomerProvider
  • Clases de consulta de bases de datos genéricas, por ejemplo, DatabaseQuery

La clase DatabaseQuery sería responsable de utilizar el controlador de la base de datos para consultar la base de datos y ensamblar los datos resultantes en un conjunto de resultados genérico, como un DataTable. El CustomerProvider sería responsable de usar la clase DatabaseQuery para ejecutar SQL en la base de datos y usar los resultados de ese SQL para ensamblar las instancias del Cliente. El cliente sería un objeto de dominio "puro" que contenía datos y lógica relacionados con los clientes.

En cuanto a si las clases de proveedores deben estar en el nivel empresarial o en el nivel de datos, no tengo una opinión sólida. Puedo ver un caso para ambos. La parte importante es que separe las responsabilidades entre las clases.

Así que ahora analicemos la carga diferida. Digamos que quería que el Cliente tuviera una colección de Pedidos, pero no quiero retirar los Pedidos de la base de datos a menos que el consumidor intente acceder a ellos. Crearía una propiedad en el Cliente llamada Pedidos. En el captador de esa propiedad, verificaría si algún campo de órdenes privadas estaba poblado o si era nulo. Si es nulo, cargue los pedidos desde la base de datos utilizando un OrderProvider. De lo contrario, solo devuelva la colección que ya estaba cargada.

En mi opinión, la necesidad de que el Cliente se comunique con OrderProvider no viola PI. El cliente todavía no sabe cómo recibe los pedidos. Simplemente sabe que los obtiene de OrderProvider. Puede haber otras razones para desacoplar al Cliente de OrderProvider, pero no creo que PI sea un problema aquí.

Esto supone que está haciendo ignorancia de persistencia manualmente. Si está utilizando un marco ORM como Entity Framework o Hibernate, esos marcos generalmente tienen características para admitir la carga diferida de forma automática.

RationalGeek
fuente
hola, en caso de que encuentres el tiempo - he editado mi publicación en respuesta a tu respuesta
user1483278
1
@ user1483278 Edité mi respuesta para responder esas preguntas.
RationalGeek
¿Qué significa PI?
Kugel
Ignorancia de persistencia
RationalGeek
2

Solo tiene alguna clase de conexión que llena los objetos de dominio (digamos, algo llamado "repositorio"). Puede implementar una carga diferida o cualquier tipo de esquema de coherencia de caché que desee y los objetos de dominio no son más sabios. Estás separando la responsabilidad de poblar objetos de dominio de ser objetos de dominio.

Erik Dietrich
fuente