Я изучаю использование Autofac в нашем веб-приложении, ранее использовав Castle Windsor в прошлом.
Что мне действительно нравится в Autofac, так это возможность выражать построение динамических компонентов с помощью лямбда-выражений, в отличие от создания DependancyResolvers и т. д. в Windsor.
Один из сценариев, который у меня есть, заключается в том, что я хочу, чтобы определенный компонент был зарегистрирован в области уровня сеанса ASP.NET. С Windsor я бы создал/использовал новый LifestyleManager, однако с Autofac я придумал следующее:
//Register SessionContext at HTTP Session Level
builder.Register(c =>
{
HttpContext current = HttpContext.Current;
//HttpContext handes delivering the correct session
Pelagon.Violet.Core.Interfaces.SessionContext instance = current.Session["SessionContext"] as Pelagon.Violet.Core.Interfaces.SessionContext;
if (instance == null)
{
instance = c.Resolve<Pelagon.Violet.Core.Interfaces.SessionContext>();
current.Session["SessionContext"] = instance;
}
return instance;
})
.FactoryScoped();
Который в какой-то момент я мог бы превратить в метод расширения. Я согласен, что эта реализация будет бомбить, если HttpContext.Current.Session имеет значение null, поскольку его следует использовать только в веб-приложении.
Вопрос в том:
Какова наилучшая практика для такой регистрации в Autofac. Я видел много упоминаний об использовании вложенных контейнеров и т. д., но не видел конкретных примеров, и мне очень хочется понять, что может быть не так с описанным выше подходом (единственное, что я могу придумать, это автоматическая утилизация).
Спасибо.