J'ai une configuration de modèle de référentiel utilisant NHibernate. La classe de base ressemble à ceci:Unité de travail et modèle de référentiel
public interface IUnitOfWork : IDisposable
{
void Commit();
void Rollback();
}
// generic NHibernate implementation of IUnitOfWork here
public class NHibernateRepositoryBase<T> : IRepository<T>
{
private NHibernateUnitOfWork _unitOfWork;
public NHibernateRepositoryBase(NHibernateUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public T Get(object id)
{
return _unitOfWork.Session.Get<T>(id);
}
// ...
}
Comme vous pouvez le voir, je suis permettant à l'unité de travail à être renseigné par le constructeur (en utilisant StructureMap). Je peuplant les objets du référentiel sur mes services Web ASP.NET comme ceci:
[WebService(Namespace = "...")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ModuleService : System.Web.Services.WebService
{
public IUserAccountRepository UserAccountRepo { get; set; }
public ModuleService()
{
// tell IoC to inject properties
ObjectFactory.BuildUp(this);
}
// ...
}
Comme vous pourriez être en mesure de déduire, mon problème est que par la conception, je l'ai maintenant perdu le contrôle du cycle de vie de l'unité de travail. Auparavant, je faisais l'unité de travail un contexte objet sensible et le dépôt obtiendrais une référence à elle par quelque chose comme:
public class NHibernateRepositoryBase<T> : IRepository<T>
{
public T Get(object id)
{
return NHibernateUnitOfWork.GetCurrent().Session.Get<T>(id);
}
// ...
}
Cette conception précédente m'a permis de contrôler le cycle de vie de l'unité de travail dans mon code en créant l'unité de travail à partir d'un UnitOfWorkFactory dans une instruction using. J'essayais de mettre plus de travail entre les mains du conteneur de l'IoC, mais je pense que j'ai fait un pas en arrière. Que pensez-vous de la mise en œuvre?
Comment gérez-vous les transactions individuelles dans ce type de configuration? Supposons que je doive exécuter deux ensembles de code distincts au sein d'une même session, et que chacun ait sa propre transaction. Comment recommanderiez-vous de gérer cela? – Chris
Les transactions sont gérées via la session. Vous n'avez besoin de rien d'autre que la référence de session pour utiliser une transaction. –
La session NHibernate est fondamentalement une unité de travail en soi. La raison pour le cacher derrière votre propre interface d'unité de travail est fondamentalement de sorte que vous puissiez l'exposer de manière générique au reste de l'application (en dehors de votre référentiel) et ne pas dépendre de NHibernate. Et ce sera surtout pour l'initialiser au début de la requête et la valider à la fin. –