Я изучаю использование Autofac в нашем веб-приложении, ранее использовавшем Castle Windsor.
Что мне действительно нравится в Autofac, так это возможность выражать динамическое построение компонентов через выражения lamda, а не создавать 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. Я видел много упоминаний об использовании вложенных контейнеров и т. Д., Но не приводил конкретных примеров, и мне хотелось бы понять, что может быть не так с вышеуказанным подходом (единственное, что я могу придумать, это вещи с автоматическим удалением).
Спасибо.