NHibernate и AUTOFAC в приложении WinForm - PullRequest
4 голосов
/ 06 января 2012

Я ищу хороший учебник по настройке AUTOFAC с NHibernate в приложении WinForm, внедряющем ISession при создании формы и размещающем ISession при закрытии формы.

Я нашел много MVC и ASPПример .NET, но ни один из них не использует WinForm.

Можете ли вы указать мне правильное направление?

Ответы [ 2 ]

3 голосов
/ 13 января 2012

Я бы сделал что-то подобное

public class FormFactory
{
    readonly ILifetimeScope scope;

    public FormFactory(ILifetimeScope scope)
    {
        this.scope = scope;
    }

    public TForm CreateForm<TForm>() where TForm : Form
    {
        var formScope = scope.BeginLifetimeScope("FormScope");
        var form = formScope.Resolve<TForm>();
        form.Closed += (s, e) => formScope.Dispose();
        return form;
    }
}

Зарегистрируйте свой ISession как InstancePerLifetimeScope, и Autofac избавится от него, когда его охват будет ликвидирован. В этом примере я использую тег «FormScope», чтобы при случайном попытке разрешить ISession из другой области (возможно, области контейнера верхнего уровня) Autofac сгенерирует исключение.

builder.Register(c => SomeSessionFactory.OpenSession())
    .As<ISession>()
    .InstancePerMatchingLifetimeScope("FormScope");

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

0 голосов
/ 31 августа 2012

Я знаю, что уже слишком поздно, и danyolgiax уже нашел решение.Вчера мне было интересно, как совместить Autofac с MVP в Winforms.Я зашел в эту статью .

Она написана на польском языке, поэтому не стесняйтесь использовать переводчик.Представленная идея очень аккуратная, ясная, и я обязательно последую ее примеру, когда мы перейдем к Autofac с нашим проектом.Я думал, что стоит оставить его здесь для людей, которые должны столкнуться с той же проблемой.

...