2011-12-25 4 views
0

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

Я нашел это на уроке виндзора.

http://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Six-Persistence-Layer.ashx

«Там один важный, хотя и невидимый эффект от того, что мы только что сделали. Регистрируясь компоненты мы не просто сказать Виндзор, как создать их. Windsor будет также заботиться должным образом уничтожая экземпляры для мы, таким образом, заботимся о том, чтобы управлять их полным сроком службы. В условиях непрофессионала Windsor будет распоряжаться обоими объектами, когда они больше не используются. Это означает, что он очистит внесенные нами изменения в ISession для базы данных для нас, и он очистит ISessionFactory, и мы получаем все это бесплатно ».

звучит так, что нам не нужно совершать наши изменения в базе данных, Windsor позаботится того, что. Я предполагаю, что Виндзор сделает это после того, как страница будет закрыта или полностью загружена.

сейчас я вижу, что другие люди добавляют еще одну единицу работы на вершине Нибграната, как этот.

Любопытно, какой из них считается лучшей практикой?

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

ответ

0

Не уверен, но я бы не пошел по этому маршруту. Выглядит слишком сложно. Есть ли причина, которую вы не хотите использовать (session.open ..) {...}?