Я бы сделал что-то подобное
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");
Ваш код должен будет зафиксировать транзакцию явно (вероятно, когда пользователь нажимает кнопку Сохранить или что-то в этом роде), и он, вероятно, должен откатить транзакцию, если пользователь нажмет кнопку Отмена. Неявный откат не рекомендуется.