首页 > 代码库 > 一种把过滤器(Filter)附加到请求的处理管道中的方法

一种把过滤器(Filter)附加到请求的处理管道中的方法

  大家都应该知道在ASP.NET MVC中,把一个Filter附加到控制器或动作方法上是使用的C#注解属性这个特性。

今天给大家说说另一种田间方式:自动的我们定义的Filter附加到控制器或者动作方法上,而不需要手动在动作方法or控制器上使用C#的注解属性特性。

第一步

定义一个接口IMonoFilterProvider,接口的名称随便取,里面没有任何方法和属性,作为一个标记接口。例如:

    public interface IMonoFilterProvider    {    }

第二步

 定义一个实现了System.Web.Mvc.IFilterProvider接口的类,用于获取或设置对象的筛选器信息。

例如我的Mono项目中,定义了这样的一个类:

    public class MonoFilterProvider : IFilterProvider    {        public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)        {            var lifetimeScope = GetLifetimeScope();            var filterProviders =lifetimescope.Resolve<IEnumerable<IMonoFilterProvider>>();            return filterProviders.Select(x => new Filter(x, FilterScope.Action, null));        }    }

在GetFilters()方法中,我使用IoC容器获取所有实现了第一步中接口的类的实力。如果使用IoC容器,你就必须把实现了IMonoFilterProvider的类全部注册到IoC容器中,也就是说,你用某种方式,等到所有实现类的实例即可。


 

第三步

  把第二步骤中定义的筛选器查找类添加到Mvc的全局筛选器查找类列表中。

 FilterProviders.Providers.Add(new MonoFilterProvider());

这个动作可以在Application_Start()方法中,也可以更早。


 

第四步

定义过滤器。方式和Mvc提供的方式一样,只要再最后添加一个实现接口IMonoFilterProvider即可,

 

 

一种把过滤器(Filter)附加到请求的处理管道中的方法