2013-07-26 35 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容器。是的,因此我使用的解決方案與您所建議的類似,但是想知道是否有更好的解決方案。 –