NHibernate Unit Of Work - несколько сессий (WinForms) - PullRequest
3 голосов
/ 21 декабря 2010

Я борюсь с кривой обучения для NHibernate.

В настоящее время мы переносим наше приложение C # Winforms для использования NHibernate и используем единицу работы (UnitOfWork), как описано Габриэлем Шенкером.

NHibernate и тип единицы работы

Мы хотим использовать UnitofWork на «разговорной» основе.Например, когда пользователь открывает форму, мы открываем сеанс UnitOfWork и затем сохраняем его открытым, пока форма не будет закрыта.Формы - это просто более простой способ определения делового разговора, мы можем немного изменить это в зависимости от реализации, но для этого примера, пожалуйста, используйте открытие и закрытие формы в качестве примера.

Проблема существует, когда у нас естьсценарий открытия формы поверх другой формы.В этом случае у нас должно быть два работающих UnitOfWork.Один все еще активен для базовой формы и новый UnitOfWork для новой формы.

Как мы реализуем это?Функциональность UnitOfWork, предоставляемая Габриэлем, допускает только один сеанс на UnitOfWork?Мои первые мысли - хранить сессии в Словаре, чтобы сессии можно было вызывать из любой формы или части приложения.

Ваши мысли?

Ответы [ 2 ]

2 голосов
/ 21 декабря 2010

Прочитайте статью Ayende о создании настольного приложения с помощью NHibernate в журнале MSDN здесь: http://msdn.microsoft.com/en-us/magazine/ee819139.aspx. Он рассказывает, как управлять несколькими единицами работы в приложении с толстым клиентом.

0 голосов
/ 21 декабря 2010

Если 2-я форма является дочерней формой - например, модальной формой для редактирования деталей - тогда она участвует в том же самом UOW, что и родительский, и UOW должен быть передан от родительского к дочернему, обычно вконструктор.

Я не фанат подхода в статье Габриэля Шенкера;Я думаю, что лучше использовать ISession напрямую как реализацию UOW.

Статья Айенде, на которую ссылается ответ Джеймса, хороша, но мы делаем это немного по-другому.Для форм верхнего уровня, которые управляют собственным UOW, у нас есть статический метод в Program.cs для создания ISession, который вызывается в конструкторе формы:

private readonly ISession _session;

public frmPlayerViewer()
{
    InitializeComponent();
    // bail out if we're in the designer
    if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
    {
            return;
    }
    _session = Program.OpenEvtSession(FlushMode.Commit);
}

Чтобы убедиться, что ISession правильно расположенпереопределить OnFormClosing:

    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        base.OnFormClosing(e);
        if (!e.Cancel && _session != null)
        {
            if (_session.Transaction.IsActive)
            {
                const string msg = "OnFormClosing with active transaction.";
                log.Error(msg);
                throw new Exception(msg);
            }
            _session.Dispose();
        }
    }

Этот код находится в базовой форме, которую расширяют формы верхнего уровня.

...