Register global filters in ASP.Net MVC 4 and Autofac
我有一个这样的过滤器:
1 2 3 4 5 | public class CustomFilterAttribute : ActionFilterAttribute, IAuthorizationFilter { public MyPropery Property { get; set; } .... } |
我需要为项目中的每个操作运行它
我试图在GlobalFilters中注册它,但是我的属性没有被注入
我尝试了此解决方案来注册我的过滤器,但未调用
关于如何做到这一点的任何想法?
有一种在AutoFac中注册MVC全局过滤器的新方法。首先,从您的
然后,按如下所示注册您的容器:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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)); |
请注意,通过将
1 2 3 | builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>())) .AsActionFilterFor<HomeController>(c => c.Index()) .InstancePerHttpRequest(); |
如果您的操作采用参数,请使用
1 2 3 | builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>())) .AsActionFilterFor<HomeController>(c => c.Detail(default(int))) .InstancePerRequest(); |
请注意,您必须根据要注册的过滤器类型使用不同的扩展方法,以下是受支持的过滤器类型:
- AsActionFilterFor
- AsAuthorizationFilterFor
- AsExceptionFilterFor
- AsResultFilterFor
您现在应该立即使用Pete的解决方案来执行此操作。感谢他提供了更新的解决方案。
我终于做到了,这是怎么做:
首先使用具有所有依赖项的构造函数创建属性
1 2 3 4 5 6 7 8 9 10 | public class CustomFilterAttribute : ActionFilterAttribute, IAuthorizationFilter { private IProperty _property; public CustomFilterAttribute(IProperty repository) { _property = property; } .... } |
在autofac中注册所需的一切
1 2 3 4 5 6 7 8 9 10 11 | var builder = new ContainerBuilder(); builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.RegisterType<MyProperty>().As<IProperty>(); builder.RegisterType<CustomFilterAttribute>().SingleInstance(); builder.RegisterFilterProvider(); IContainer container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); |
像这样注册您的全局过滤器
1 2 3 4 5 | public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); filters.Add(DependencyResolver.Current.GetService<CustomFilterAttribute>()); } |
确保在global.asax中先注册Autofac,然后注册全局过滤器。
现在,您不再需要属性注入,构造函数注入将可以正常工作,这是一件好事!