Объем сеанса Autofac

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

Спасибо.


person crowleym    schedule 09.09.2009    source источник


Ответы (1)


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

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

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

person Nicholas Blumhardt    schedule 10.09.2009
comment
Привет Ник. Спасибо за отзыв об использовании вложенных контейнеров для управления областью действия в веб-приложении. Знаете ли вы какие-либо конкретные примеры, например, файл Global.asx, в котором показано, где создается и используется каждый контейнер? В документах не увидел. - person crowleym; 10.09.2009
comment
Не уверен, что он обновлен на 100%, но это должно помочь: code.google.com/p/autofac/source/browse/branches/1.4/src/ - person Nicholas Blumhardt; 11.09.2009