Autofac Session Scope - PullRequest
       10

Autofac Session Scope

1 голос
/ 09 сентября 2009

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

Спасибо.

1 Ответ

0 голосов
/ 10 сентября 2009

Это выглядит хорошо.

Пометка компонента 'ExternallyOwned ()' гарантирует, что Autofac не вызовет Dispose() для него.

Единственный недостаток здесь заключается в том, что ваш компонент в области сеанса может разрешать собственные зависимости через текущий контейнер и, таким образом, хранить ссылки на вещи, которые могут принадлежать текущему запросу (например.). Это должно быть легко обнаружить в хотя тестирование.

...