Intendo implementare un repository e vorrei utilizzare il modello UOW poiché il consumatore del repository potrebbe eseguire diverse operazioni e desidero impegnarle contemporaneamente.
Dopo aver letto diversi articoli sull'argomento, non riesco ancora a mettere in relazione questi due elementi, a seconda dell'articolo che viene fatto in modo diverso.
A volte l'UOW è qualcosa di interno al repository:
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());
}
}
E a volte è esterno:
public class Repository
{
public void Save(Entity e, UnitOfWork uow)
{
uow.Track(e);
}
public void SubmittChanges(UnitOfWork uow)
{
SaveInStorage(uow.GetChanges());
}
}
Altre volte, è l'UOW che fa riferimento al repository
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());
}
}
In che modo sono collegati questi due elementi? UOW tiene traccia degli elementi che devono essere modificati e il repository contiene la logica per persistere a quei cambiamenti, ma ... chi chiama chi? L'ultimo ha più senso?
Inoltre, chi gestisce la connessione? Se nel repository devono essere eseguite diverse operazioni, penso che usare la stessa connessione e persino la transazione sia più valido, quindi magari mettere l'oggetto di connessione all'interno dell'UOW e anche questo all'interno del repository ha senso.
Saluti