Après avoir lu beaucoup d'articles, je ne suis toujours pas sûr des responsabilités du modèle d'unité de travail lors de l'interaction avec les dépôts.Interaction entre l'unité de travail et les modèles de dépôt
Référentiels sont responsables pour le chargement et l'enregistrement des entités de racine d'agrégation, alors pensez à l'exemple de code suivant:
using(IUnitOfWork uow = container.CreateUnitOfWork())
{
Repository<ARoot> roots = container.GetRepository<ARoot>();
ARoot root = root.FindByName("ARoot");
root.Name = "ANewName";
roots.Save(root);
uow.Commit();
}
L'unité d'interface de travail serait définie par les méthodes suivantes:
public interface IUnitOfWork
{
void Insert(object);
void Update(object);
void Delete(object);
void Commit();
void Rollback();
}
Lets indique que le référentiel est implémenté à l'aide d'un SQL Mapper très simple, donc le FindByName contient du SQL direct pour renvoyer ARoot, l'implémentation de Save ressemblerait-elle à ceci:
public void Save(T entity)
{
IUnitOfWork uow = GetUnitOfWork();
// Tell the UOW we are updating this entity
uow.Update(entity);
}
Le code de validation d'unité de travail construirait alors tout le SQL requis pour mapper l'entité dans le DB?
Question 2)
Si j'ajoute une racine globale dans l'unité de travail, est l'unité de travail responsable de persisiting la racine, et ses enitities enfants, ou devrait être la méthode Save du référentiel ajouter la changé les entités dans l'unité de travail? par exemple
public void Save(T entity)
{
IUnitOfWork uow = GetUnitOfWork();
// Tell the UOW we are updating this entity
uow.Update(entity);
uow.Update(entity.AChildObject);
}
OU ... Alternativly
Est-ce une unité de travail ne traitent avec des racines globales, et quand commited appelle le référentiel des méthodes Enregistrer pour chaque objet dans son ensemble de changement, en gardant le code de mappage SQL persisteront l'entité dans le référentiel, en changeant le premier exemple de code à
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();
}
Merci,
James