Déjenme explicar esto con un ejemplo. Supongamos que está implementando una aplicación utilizando un enfoque SQL clásico. Abre conjuntos de registros, cambia datos y los confirma.
pseudo código:
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();
Con NHibernate se vería algo como esto:
emp = session.Get<Employee>(empid);
// persistence ignorant 'logic'
emp.Address.Street = "Bahnhofstrasse";
emp.Address.City = "Zürich";
session.Commit();
Persistencia La ignorancia significa que la lógica de negocio en sí mismo no sabe nada de la persistencia. O, en otras palabras, la persistencia está separada de la lógica. Esto lo hace mucho más reutilizable.
Mover 'lógica' a un método reutilizable:
void MoveToZuerichBahnhofstrasse(Employee emp)
{
// doesn't have anything to do with persistence
emp.Address.Street = "Bahnhofstrasse";
emp.Address.City = "Zürich";
}
intenta escribir un procedimiento de este tipo utilizando conjuntos de resultados y usted sabe lo persistencia es la ignorancia.
Si su no están convencidos, a ver cómo simple sería una prueba de unidad, porque no hay ninguna dependencia a la persistencia cosas relacionadas:
Employee emp = new Employee();
MovingService.MoveToZuerichBahnhofstreasse(emp);
Assert.AreEqual("Bahnhofstrasse", emp.Address.Street);
Assert.AreEqual("Zürich", emp.Address.City);
DDD es algo diferente. Allí construye su modelo de dominio primero (modelo de clase) y crea el diseño de la base de datos de acuerdo con él. Con NH esto es muy simple, porque, gracias a la ignorancia de persistencia, puede escribir y probar el modelo y la lógica de la unidad antes de tener un modelo de base de datos (definitivo).
Pruebas: Estamos probando asignaciones mediante la creación de una instancia de la entidad, almacenándolo a la base de datos, recuperarlo y compararlo. Esto se hace automáticamente con mucha reflexión. Pero no necesitas ir tan lejos. la mayoría de los errores típicos aparecen cuando se trata de almacenar una entidad.
Puede hacer lo mismo con las consultas. Las consultas complejas merecen una prueba. Es más interesante si la consulta se compila en absoluto. Ni siquiera necesitas datos para esto.
Para pruebas de integración de bases de datos, estamos usando Sqlite. Esto es bastante rápido. NH produce la base de datos en memoria sobre la marcha utilizando SchemaExport (antes de cada prueba).
Agregué una sección sobre las pruebas a mi respuesta. –
Me enamoré del patrón Repository después de escuchar [Architecture: The Lost Years] (http://www.confreaks.com/videos/759-rubymidwest2011-keynote-architecture-the-lost-years). Todas las aplicaciones serias deberían emplear el patrón Repositorio. – Mario