Utilisation correcte du pattern NHibernate Unit Of Work et Ninject

J'ai la suite de la mise en œuvre et aimerait que certains des commentaires si elle fait de l'utilisation correcte de NHibernate pour les sessions et les transactions.

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 liaison

Bind<IUnitOfWork>().To<UnitOfWork>().InTransientScope();
Bind<ISessionFactory>().ToProvider<NHibernateSessionFactoryProvider>().InSingletonScope();
Bind<IRepository>().To<Repository>().InTransientScope();

Voici un exemple de l'utilisation:

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();
        }         
    }
}

Dans mon précédent de mise en œuvre, je voudrais injecter IUnitOfWork dans mon référentiel constructeur comme

public Repository(IUnitOfWork unitOfWork)
    {...

Mais la méthode dispose() ne serait pas exécuter provoquant un appel ultérieur à lever cette exception: "Impossible d'accéder à un objet supprimé. Nom de l'objet: 'AdoTransaction'."

source d'informationauteur Brian T