Мы должны использовать нашу собственную единицу работы поверх Nhibernate ISession
Я только начинаю изучать замок Виндзор. Задайте вопрос, стоит ли мне добавить еще одну единицу работы поверх Nhibernate ISession.
Я нашел это на уроке Виндзор.
http://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Six-Persistence-Layer.ashx
"Есть один важный, хотя и невидимый эффект от того, что мы только что сделали. Регистрируя компоненты, мы не просто сообщали Виндзору, как их создавать. Виндзор также позаботится о том, чтобы должным образом уничтожить экземпляры для нас, таким образом позаботившись об управлении их полной время жизни. С точки зрения непрофессионала, Windsor утилизирует оба объекта, когда они больше не используются. Это означает, что он сбросит изменения, внесенные нами в ISession, в базу данных для нас, и очистит ISessionFactory. И мы получим все это бесплатно. "
Похоже, нам не нужно вносить изменения в базу данных, Виндзор позаботится об этом. Я предполагаю, что Виндзор сделает это после того, как страница будет закрыта или полностью загружена.
теперь я вижу, как другие люди добавляют еще одну единицу работы поверх Нибрената, как эта.
Просто любопытно, какой из них считается лучшей практикой?
UnitOfWork unitOfWork = new UnitOfWork(session);
Repository<Truck> repository = new Repository<Truck>(unitOfWork.Session);
Truck truck = CreateTruck(string.Format("Truck {0}", i + 1), 1000);
repository.Add(truck);
unitOfWork.Commit();
namespace RepositoryPattern.Data.Orm.nHibernate
{
public class UnitOfWork : IUnitOfWork
{
public ISession Session { get; private set; }
private readonly ITransaction _transaction;
public UnitOfWork(ISession session)
{
Session = session
Session.FlushMode = FlushMode.Auto;
_transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted);
}
public void Commit()
{
if (!_transaction.IsActive)
{
throw new InvalidOperationException("Oops! We don't have an active transaction");
}
_transaction.Commit();
}
public void Rollback()
{
if (_transaction.IsActive)
{
_transaction.Rollback();
}
}
public void Dispose()
{
if (Session.IsOpen)
{
Session.Close();
}
}
}
}
1 ответ
Не уверен, но я бы не пошел по этому пути. Выглядит слишком сложно. Есть ли причина, которую вы не хотите использовать с помощью (session.open..) { ... }?