Мы должны использовать нашу собственную единицу работы поверх 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..) { ... }?

Другие вопросы по тегам