Ich habe die folgende Implementierung und möchte ein Feedback darüber, ob NHibernate korrekt für Sitzungen und Transaktionen verwendet wird.Korrekte Verwendung des NHibernate-Unit-of-Work-Musters und Ninject
public interface IUnitOfWork : IDisposable
{
ISession CurrentSession { get; }
void Commit();
void Rollback();
}
public class UnitOfWork : IUnitOfWork
{
private readonly ISessionFactory _sessionFactory;
private readonly ITransaction _transaction;
public UnitOfWork(ISessionFactory sessionFactory)
{
_sessionFactory = sessionFactory;
CurrentSession = _sessionFactory.OpenSession();
_transaction = CurrentSession.BeginTransaction();
}
public ISession CurrentSession { get; private set; }
public void Dispose()
{
CurrentSession.Close();
CurrentSession = null;
}
public void Commit()
{
_transaction.Commit();
}
public void Rollback()
{
if (_transaction.IsActive) _transaction.Rollback();
}
}
Ninject
BindungBind<IUnitOfWork>().To<UnitOfWork>().InTransientScope();
Bind<ISessionFactory>().ToProvider<NHibernateSessionFactoryProvider>().InSingletonScope();
Bind<IRepository>().To<Repository>().InTransientScope();
Hier ist ein Beispiel für die Nutzung:
public class Repository : IRepository
{
private readonly ISessionFactory _sessionFactory;
public Repository(ISessionFactory sessionFactory)
{
_sessionFactory = sessionFactory;
}
public void Add(IObj obj)
{
using (var unitOfWork = new UnitOfWork(_sessionFactory))
{
unitOfWork.CurrentSession.Save(obj);
unitOfWork.Commit();
}
}
}
In meiner vorherigen Implementierung würde ich wie IUnitOfWork in mein Repository Konstruktor injiziert so
public Repository(IUnitOfWork unitOfWork)
{...
Die Dispose() -Methode wurde jedoch nicht ausgeführt, was dazu führte, dass ein nachfolgender Aufruf diese Ausnahme auslöst: "Auf ein entsorgtes Objekt kann nicht zugegriffen werden. Objektname: 'AdoTransaction'. "
Nicht sicher, was Ihre endgültige Entscheidung war ABER tun Sie es nicht! :) Im Ernst, NHibernate fügt bereits eine Menge Abstraktion und ein UoW-Muster hinzu. Verwenden Sie einfach NHibernate direkt aus der Box und halten Sie Ihren Code einfach. Willst du wirklich noch mehr Abstraktion zum Debuggen? –