Pregunta

Estoy en el proceso de ponerme al día con la documentación técnica de un proyecto que completé hace algunos meses y que estoy a punto de terminar. Utilicé repositorios para abstraer la capa de acceso a datos en ambos y estaba escribiendo un breve resumen del patrón en nuestro wiki en el trabajo.

Mientras escribía este resumen, me di cuenta de que adopté un enfoque ligeramente diferente la segunda vez.

Uno utilizó un método explícito InsertOnSubmit junto con una Unidad de trabajo y una actualización implícita con los cambios de seguimiento de UoW. El otro tenía un método Save que insertaba nuevas entradas y actualizaba las existentes (sin una UoW).

¿Qué enfoque preferirías normalmente? Considere los escenarios de CRUD habituales, ¿dónde debería estar la responsabilidad de cada uno de ellos?

¿Fue útil?

Solución

Creo que si un repositorio usa Unidad de trabajo, almacenamiento en caché o cualquier otro concepto relacionado debe dejarse para la implementación. Prefiero que la interfaz se parezca a un almacén de datos que está alineado con el modelo de dominio en cuestión. Para que el repositorio de un cliente se vea así:

interface ICustomerRepository
{
    Customer Load(int id);
    IEnumerable<Customer> Search(CustomerQuery q);
    void Save(Customer c);
    void Delete(Customer c);
}

Esto puede implementarse fácilmente mediante algo como NHibernate, o NHibernate con NHibernate.Linq, o una biblioteca SQL directa, o incluso un almacén de archivos planos o XML. Si es posible, me gusta mantener el concepto de transacción fuera del repositorio, o en un ámbito más global para que las operaciones de varios repositorios puedan formar parte de una sola transacción.

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