大家都应该知道在ASP.NET MVC中,把一个Filter附加到控制器或动作方法上是使用的C#注解属性这个特性。
今天给大家说说另一种田间方式:自动的我们定义的Filter附加到控制器或者动作方法上,而不需要手动在动作方法or控制器上使用C#的注解属性特性。
第一步
定义一个接口IMonoFilterProvider,接口的名称随便取,里面没有任何方法和属性,作为一个标记接口。例如:
public interface IMonoFilterProvider { }
第二步
定义一个实现了System.Web.Mvc.IFilterProvider接口的类,用于class="sentence" data-source="Gets or sets the filter information for an object." data-guid="5019a2a34eae399a27dba29bcf87b0d9">获取或设置对象的筛选器信息。
例如我的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即可,