Después de leer un montón de artículos, todavía no estoy seguro de las responsabilidades del patrón de unidad de trabajo al interactuar con repositorios.Interacción entre unidad de trabajo y patrones de repositorio
repositorios son responsables de cargar y guardar entidades raíz de agregados, así que considere el siguiente código de ejemplo:
using(IUnitOfWork uow = container.CreateUnitOfWork())
{
Repository<ARoot> roots = container.GetRepository<ARoot>();
ARoot root = root.FindByName("ARoot");
root.Name = "ANewName";
roots.Save(root);
uow.Commit();
}
La unidad de interfaz de trabajo se define con los siguientes métodos:
public interface IUnitOfWork
{
void Insert(object);
void Update(object);
void Delete(object);
void Commit();
void Rollback();
}
Lets decir que el repositorio se implementa utilizando un SQL Mapper muy sencillo, por lo que FindByName contiene algunos SQL directos para devolver ARoot, la implementación de Save se vería así:
public void Save(T entity)
{
IUnitOfWork uow = GetUnitOfWork();
// Tell the UOW we are updating this entity
uow.Update(entity);
}
El código de Compromiso de la Unidad de Trabajo construiría entonces todos los SQL necesarios para volver a asignar la entidad al DB?
Pregunta 2)
Si añado una raíz agregada a la unidad de trabajo, es la unidad de trabajo responsable de persisiting la raíz, y sus enitities niño, o debería ser el método Save del repositorio añadir el las entidades modificadas en la Unidad de trabajo? por ejemplo
public void Save(T entity)
{
IUnitOfWork uow = GetUnitOfWork();
// Tell the UOW we are updating this entity
uow.Update(entity);
uow.Update(entity.AChildObject);
}
O ... Alternativly
¿Una unidad de trabajo sólo se ocupan con raíces agregados, y cuando llama cometido el repositorio Guardar métodos para cada objeto en su conjunto de cambios, manteniendo el código SQL para la cartografía persistir la entidad en el repositorio, cambiando el primer ejemplo de código para
using(IUnitOfWork uow = container.CreateUnitOfWork())
{
Repository<ARoot> roots = container.GetRepository<ARoot>();
ARoot root = root.FindByName("ARoot");
root.Name = "ANewName";
//roots.Save(root);
uow.Update(root);
// and commit
uow.Commit();
}
Gracias,
James