Вопросы по единице работы - Nhibernate (уровень изоляции и что еще будет в UoW) - PullRequest
2 голосов
/ 10 сентября 2011

Я изучаю шаблон UoW и у меня есть 3 вопроса.

  public class UnitofWork : unitofwork.Models.IUnitofWork
    {
        private readonly ITransaction transaction;
        private readonly ISession session;

        public UnitofWork(ISession session)
        {
            this.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. Я только что узнал об "IsolationLevels", и мне интересно, какой из них вы должны использовать? Что произойдет, если вам нужно использовать несколько «IsolationLevels» для разных транзакций? Как бы вы сконфигурировали свой UoW (вы бы сделали несколько реализаций вышеупомянутого класса?)

  2. Иначе как Rollback and Commit обычно входит в UoW? Я знаю, что такие вещи, как создание, обновление, получение запросов, попадут в репозиторий (если вы используете этот шаблон). Так что еще вы можете увидеть в нем?

  3. Я скопировал это UoW с какого-то сайта (у меня его сейчас нет) и внес изменения в соответствии с моими потребностями (например, я использую ninject, поэтому я чувствовал, что нет смысла принимать UoW в фабрике сессий и открытии сессии в UoW)

Мне интересно, для чего нужен Dispose? Я видел это несколько раз раньше (некоторые, кажется, реализуют IDispose).

На самом деле я не использую его сейчас ни в одном из моих кодов. Мне интересно, если это необходимо для меня, как я уже упоминал, я использую ninject, и он обрабатывает сессию (т.е. закрывает ее, как только я закончу)

  public void Dispose()
        {
            if (session.IsOpen)
            {
                session.Close();
            }
        }

Редактировать

Я добавил это в свою единицу работы

   public void BeginTransaction()
    {
        transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);
    }

    public void BeginTransaction(IsolationLevel level)
    {
        transaction = session.BeginTransaction(level);
    }

Я убрал его из конструктора

1 Ответ

3 голосов
/ 10 сентября 2011

ISession сам по себе является реализацией в виде единицы работы, поэтому реализация вашей собственной цели совершенно необязательна.

  1. IsolationLevel объявлен в пространстве имен System.Data. ReadCommitted - наиболее часто используемый; это также по умолчанию для SQL Server. Я пытался использовать Хаос только один раз, потому что мне нравится имя, но SQL Server его не поддерживает.
  2. Код, который у вас есть в вопросе, создает транзакцию сразу после открытия сеанса, поэтому это транзакция для реализации UOW; обратите внимание, что если вы вызываете Commit или Rollback, любые дополнительные операции будут происходить за пределами области транзакции. Мне это очень не нравится, и я предпочитаю контролировать собственную область транзакции, поэтому в моем UOW будет BeginTransaction.
  3. Классы, реализующие IDisposable, должны реализовывать метод Dispose и должны использоваться в блоке using или утилизироваться вручную. Это означает, что в классе есть операции очистки, которые необходимо выполнить, например, закрытие сеанса ISession. Здесь метод Dispose должен просто вызывать ISession.Dispose, а не просто закрывать сеанс.
...