Vou implementar um repositório e gostaria de usar o padrão UOW, pois o consumidor do repositório poderia executar várias operações, e quero confirmá-las de uma só vez.
Depois de ler vários artigos sobre o assunto, ainda não entendo como relacionar esses dois elementos, dependendo do artigo que está sendo feito de uma maneira ou de outra.
Às vezes, o UOW é algo interno ao repositório:
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 às vezes é externo:
public class Repository
{
public void Save(Entity e, UnitOfWork uow)
{
uow.Track(e);
}
public void SubmittChanges(UnitOfWork uow)
{
SaveInStorage(uow.GetChanges());
}
}
Outras vezes, é o UOW quem faz referência ao Repositório
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());
}
}
Como esses dois elementos estão relacionados? O UOW rastreia os elementos que precisam ser alterados e o repositório contém a lógica para persistir essas alterações, mas ... quem chama quem? O último faz mais sentido?
Além disso, quem gerencia a conexão? Se várias operações tiverem que ser feitas no repositório, acho que usar a mesma conexão e até a transação é mais sólida, então talvez coloque o objeto de conexão dentro da UOW e essa dentro do repositório faça sentido também.
Felicidades