Einheit von Arbeit und das repository-pattern
Ich habe eine repository-pattern-setup mit NHibernate. Die Basis-Klasse sieht wie folgt aus:
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);
}
//...
}
Wie Sie sehen können, ich bin so dass die Einheit der Arbeit aufgefüllt werden über den Konstruktor (mit StructureMap). Ich bin das Auffüllen der repository-Objekte auf meine ASP.NET web services etwa so:
[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);
}
//...
}
Wie Sie vielleicht in der Lage sein zu folgern, mein problem ist, dass durch die Art des design, ich habe jetzt verlor die Kontrolle über den Lebenszyklus der Einheit arbeiten. Bisher habe ich die Einheit der Arbeit ein Kontext-sensitives Objekt und das repository würde, um eine Referenz auf es über so etwas wie:
public class NHibernateRepositoryBase<T> : IRepository<T>
{
public T Get(object id)
{
return NHibernateUnitOfWork.GetCurrent().Session.Get<T>(id);
}
//...
}
Diese Vorherige design mir erlaubt, Steuerung des Lebenszyklus der Einheit von Arbeit in meinem code durch die Schaffung der Einheit von Werk aus UnitOfWorkFactory innerhalb einer using-Anweisung. Ich versuchte, mehr von der Arbeit in die Hände der IoC-container, aber ich denke, ich habe eigentlich ein Rückschritt. Was sind Ihre Gedanken auf, die entweder die Umsetzung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist normalerweise eine gute Sache, lassen Sie Ihre IoC-container-handle so viel wie möglich. Auf der web-eine unit of work pattern bekommen normalerweise initialisiert beim start der Anfrage und verpflichtet sich am Ende (Rollback, wenn es Ausnahmen). Auf diese Weise werden Ihre repository wird eine ISession im Konstruktor anstelle des unitofwork. Diese Weise, Ihr repository nicht zu tun haben mit der Begehung oder nichts, und das wird alles automatisch für Sie erledigt.