Asp.net-Mvc-4
在 ASP.Net MVC 4 和 Autofac 中註冊全域過濾器
我有一個像這樣的過濾器:
public class CustomFilterAttribute : ActionFilterAttribute, IAuthorizationFilter { public MyPropery Property { get; set; } .... }我需要為我的項目中的每個操作執行它
我試圖在 GlobalFilters 中註冊它,但我的屬性沒有被注入
我試過這個解決方案來註冊我的過濾器,但它沒有被呼叫
關於如何做到這一點的任何想法?
有一種在 AutoFac 中註冊 MVC 全域過濾器的新方法。首先,從您的過濾器註冊中刪除
RegisterGlobalFilters,因為我們將使用 Autofac 處理將它們添加到我們的控制器/操作而不是 MVC。然後,按如下方式註冊您的容器:
var builder = new ContainerBuilder(); builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.RegisterType<MyProperty>().As<IProperty>(); builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>())) .AsActionFilterFor<Controller>().InstancePerHttpRequest(); builder.RegisterFilterProvider(); IContainer container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container));請注意,通過將
Controller類傳遞到擴展AsActionFilterFor()中,我們告訴 AutoFac 將此過濾器應用於從該類派生的所有Controller類(在 MVC 中,所有類都是控制器)。由於我們在AsActionFilterFor()沒有任何參數的情況下呼叫,我們還指定我們希望將過濾器應用於指定控制器中的所有操作。如果要將過濾器應用於選擇控制器和操作,可以使用 lambda 表達式,如下所示:builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>())) .AsActionFilterFor<HomeController>(c => c.Index()) .InstancePerHttpRequest();如果您的操作帶有參數,請使用
default關鍵字指定:builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>())) .AsActionFilterFor<HomeController>(c => c.Detail(default(int))) .InstancePerRequest();請注意,您必鬚根據您註冊的過濾器類型使用不同的擴展方法,以下是支持的過濾器類型:
- AsActionFilterFor
- AsAuthorizationFilterFor
- AsExceptionFilterFor
- AsResultFilterFor