Ho intenzione di implementare un repository, e vorrei usare il pattern UOW poiché il consumer del repository potrebbe fare diverse operazioni, e voglio impegnarle in una volta.
Dopo aver letto diversi articoli sull'argomento, non capisco ancora come mettere in relazione questi due elementi, a seconda dell'articolo che viene fatto in un altro modo.
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 questi due elementi sono correlati? UOW tiene traccia degli elementi che devono essere modificati e il repository contiene la logica per mantenere tali modifiche, ma ... chi chiama chi? L'ultimo ha più senso?
Inoltre, chi gestisce la connessione? Se nel repository si devono fare diverse operazioni, penso che usare la stessa connessione e anche la transazione sia più sana, quindi magari mettere l'oggetto di connessione dentro l'UOW e anche questo all'interno del repository ha senso.
Saluti