Правильное использование шаблона NHibernate Unit Of Work и Ninject

У меня есть следующая реализация, и я хотел бы получить отзывы о том, правильно ли она использует NHibernate для сеансов и транзакций.

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

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

Вот пример использования:

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

В моей предыдущей реализации я бы вставил IUnitOfWork в свой конструктор репозитория следующим образом

public Repository(IUnitOfWork unitOfWork)
    {...

Но метод Dispose () не выполнялся, вызывая последующий вызов, вызывающий это исключение: «Невозможно получить доступ к удаленному объекту. Имя объекта: 'AdoTransaction'».

15
задан Brian T 24 November 2010 в 20:32
поделиться