다음 구현을 가지고 있으며 세션과 트랜잭션을 위해 NHibernate를 올바르게 사용하는지에 대한 피드백이 필요합니다. 내 이전 구현에서NHibernate 작업 단위 패턴과 Ninject의 올바른 사용
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();
}
}
}
내가 그렇게
public Repository(IUnitOfWork unitOfWork)
{...
처럼 내 저장소 생성자에 IUnitOfWork를 주입 것 :
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();
를 결합하는 것은 사용의 예입니다
그러나 Dispose() 메서드가 실행되어 후속 호출에서이 예외를 throw하면 "폐기 된 개체에 액세스 할 수 없습니다. 객체 이름 : 'AdoTransaction'. "
귀하의 최종 결정은 확실하지 않지만 그것을하지 마십시오! :) 진지하게, NHibernate는 이미 많은 추상화와 UoW 패턴을 추가한다. 그냥 상자 밖으로 똑바로 NHibernate를 사용하여 코드를 간단하게 유지. 디버깅을 위해 더 많은 추상화를 원하십니까? –