Укажите StructureMap для создания НОВОГО сеанса (только после удаления)

Я использую StructureMap с Nhibernate, и я хотел бы проинструктировать инструмент для создания нового сеанса каждый раз, когда это необходимо, и только если оно удалено.
Я попробую чтобы объяснить с помощью некоторого кода (это консольное приложение).

Я создаю свою фабрику сеансов таким образом (ConnDb - моя строка подключения):

For<ISessionFactory>()
 .Singleton()
 .Use(() => new NHSessionFactory(ConnDb, true).SessionFactory);

и это код, который я использую для создания сеанса:

For<ISession>()
  .Singleton()
  .Use(x => x.GetInstance<ISessionFactory>().OpenSession());

Все работает, как ожидалось, когда я не удаляю сеанс, но я хотел бы иметь возможность сделать что-то вроде этого:

    using (session)
    {
        using (var tx = session.BeginTransaction())
        {
            // DO SOMETHING
            tx.Commit();
        }
    }

    using (session)
    {
        using (var tx = session.BeginTransaction())
        {
            // DO SOMETHING
            tx.Commit();
        }
    }

Я пытался изменить код сеанса, например:

For<ISession>()
  .AlwaysUnique()
  .Use(x => x.GetInstance<ISessionFactory>().OpenSession());

но я заметил, что теперь создается новый сеанс, даже если он активен. В моей ситуации я ссылаюсь на другой компонент (Rhino.Security), который разрешает ISession с помощью локатора службы.


person LeftyX    schedule 03.02.2011    source источник


Ответы (1)


Сессией должен распоряжаться создатель Сессии, а не какой-либо клиент. Вам следует подумать о пересмотре своей архитектуры, чтобы Сессия создавалась и удалялась в той же области.

Срок службы сеанса должен быть ограничен, чтобы соответствовать компоненту, который его использует. Имея один глобальный сеанс (как и в случае с вашей попыткой синглтона), сеанс будет содержать ссылки на все сущности, к которым вы обращались в любое время в течение жизненного цикла вашего приложения, что эффективно поглощает вашу память. Кроме того, если ваш сеанс вызывает исключение, он будет в неопределенном состоянии и приведет к остановке всего вашего приложения.

Прочтите статью в журнале MSDN Айенде о том, как использовать NHibernate с настольными приложениями. Совет, который он дает, с большой вероятностью применим и к вашему сценарию.

Когда дело доходит до обработки сеансов с помощью StructureMap, Джереми Миллер имеет сообщение в блоге о том, как он это делает - используя вложенные контейнеры для контроля продолжительности жизни. Пример Джереми, вероятно, будет излишним, если приложение простое. Вероятно, вам следует сосредоточиться на внедрении одного сеанса для каждого компонента / команды в вашем приложении.

person PHeiberg    schedule 14.02.2011