Voy a implementar un repositorio, y me gustaría usar el patrón UOW ya que el consumidor del repositorio podría hacer varias operaciones, y quiero comprometerlas a la vez.
Después de leer varios artículos sobre el tema, todavía no entiendo cómo relacionar estos dos elementos, dependiendo del artículo que se está haciendo de una manera u otra.
A veces, el UOW es algo interno del repositorio:
public class Repository
{
UnitOfWork _uow;
public Repository()
{
_uow = IoC.Get<UnitOfWork>();
}
public void Save(Entity e)
{
_uow.Track(e);
}
public void SubmittChanges()
{
SaveInStorage(_uow.GetChanges());
}
}
Y a veces es externo:
public class Repository
{
public void Save(Entity e, UnitOfWork uow)
{
uow.Track(e);
}
public void SubmittChanges(UnitOfWork uow)
{
SaveInStorage(uow.GetChanges());
}
}
Otras veces, es el UOW quien hace referencia al Repositorio
public class UnitOfWork
{
Repository _repository;
public UnitOfWork(Repository repository)
{
_repository = repository;
}
public void Save(Entity e)
{
this.Track(e);
}
public void SubmittChanges()
{
_repository.Save(this.GetChanges());
}
}
¿Cómo se relacionan estos dos elementos? UOW rastrea los elementos que necesitan ser cambiados, y el repositorio contiene la lógica para persistir esos cambios, pero ... ¿quién llama a quién? ¿El último tiene más sentido?
Además, ¿quién gestiona la conexión? Si se deben realizar varias operaciones en el repositorio, creo que usar la misma conexión e incluso la transacción es más sólido, por lo que quizás poner el objeto de conexión dentro del UOW y este dentro del repositorio también tenga sentido.
Salud