2013-07-26 3 views
1

Как зарегистрировать глобальный фильтр действий с помощью AutoFac?
Обычно предлагаемый подход (приведенный ниже) представляется неправильным, поскольку фильтр действий разрешается один раз при запуске приложения со всеми инициализированными графиками зависимостей. Но если фильтр действий использует любые одноразовые объекты (например, сеанс БД не напрямую, а через служебный уровень), он работает некорректно, потому что глобальный фильтр создается один раз и живет все время и не воссоздается при утилизации зависимых служб.Регистрация фильтра глобальных глобальных действий

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    var userLocatorFilter = ContainerHolder.Container.Resolve<UserLocatorAttribute>(); 
    var userStatusFilter = ContainerHolder.Container.Resolve<UserStatusAttribute>(); 
    var logErrorFilter = ContainerHolder.Container.Resolve<LogErrorAttribute>(); 
    // or DependencyResolver.Current.GetService<CustomFilterAttribute>() 

    filters.Add(userLocatorFilter); 
    filters.Add(userStatusFilter); 
    filters.Add(logErrorFilter); 
} 

Так интересно, если есть любой вид глобальной регистрации фильтра/процесс, который воссоздаст/отчуждать его на каждом запросе или около разрешения? Другими словами, должен быть глобальный фильтр с ограниченным сроком службы.

Дайте мне знать, если вам нужно более подробное объяснение проблемы.

ответ

0

Если вы используете:

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

... вы не можете использовать DependencyResolver.Current.GetService<MyService>() внутри вас фильтров всякий раз, когда вы нуждаетесь в них?

Другим возможным решением может быть передача в Autofac Container в виде одной зависимости c'tor, из которой вы могли бы затем разрешить необходимые услуги в отдельном LifetimeScope.

Я не уверен, но вижу ContainerHolder.Container Мне интересно, какая версия Autofac вы используете - вы видели версию 3 и MVC integration?

+0

'ContainerHolder' - мой собственный статический класс для хранения контейнера Autofac. Да, в результате я использовал решение, подобное тому, которое вы предложили, но задаетесь вопросом, есть ли лучший. –

Смежные вопросы