Я использую ASP.NET MVC 3 и использую шаблоны репозитория и единицы работы с NHibernate и Ninject. Я посмотрел на пару примеров ( 1 , 2 ), чтобы помочь реализовать UoW, и я просто не уверен, где Я должен использовать единицу работы , Должен ли он быть введен в мои контроллеры и вручную вызывать Commit и Rollback в моих действиях?
Вот несколько примеров кода:
Единица работы (интерфейс расширяет IDisposable и имеет Session, Commit и Rollback)
public class UnitOfWork : IUnitOfWork
{
private readonly ISessionFactory _sessionFactory;
private readonly ITransaction _transaction;
public UnitOfWork(ISessionFactory sessionFactory)
{
_sessionFactory = sessionFactory;
Session = _sessionFactory.OpenSession();
Session.FlushMode = FlushMode.Auto;
_transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted);
}
public ISession Session { get; private set; }
public void Commit()
{
if (!_transaction.IsActive)
{
throw new InvalidOperationException("No active transation");
}
_transaction.Commit();
}
public void Rollback()
{
if (_transaction.IsActive)
{
_transaction.Rollback();
}
}
public void Dispose()
{
if (Session.IsOpen)
Session.Close();
}
}
Часть моего модуля Ninject:
Bind<IXXXRepository>().To<XXXRepository>().InRequestScope();
Bind<IYYYRepository>().To<YYYRepository>().InRequestScope();
...
Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
Bind<ISessionFactory>().ToMethod(x => NHibernateHelper.CreateConfiguration(Path.Combine(
HostingEnvironment.ApplicationPhysicalPath,
"bin",
"hibernate.cfg.xml")).BuildSessionFactory()).InSingletonScope();
Bind<ISession>().ToMethod(x => x.Kernel.Get<IUnitOfWork>().Session).InRequestScope();
Все мои репозитории наследуются от класса, которому вводится ISession
, и, как я уже говорил ранее в этом посте, я внедряю IUnitOfWork
в мои контроллеры и при необходимости вызываю Commit и Rollback. Я делаю это правильно? Должен ли я вызывать Commit только тогда, когда я делаю обновления или удаления, и вообще не беспокоиться о том, чтобы вызывать его для выбора? Будет ли это оставлять зависшую транзакцию в конце каждого запроса?