ASP.Net MVC探索之路 不想在多个Action上写同样的FitlerAttribute(下)

距离上一篇的分析已经好几天。一是由于关注的人比较少,二是正在移植入ASP.NET MVC 3.0 RC,所以就没急着做出来。
今天花了点时间把Demo做出来提供给大家下载,希望大家能够提点意见。

我们知道,在ASP.NET MVC 3.0中为我们提供了一个GlobalFilters(包含一个GlobalFilterCollection)用于注册全局Filter,但它也不够灵活——其实也不能这么说,因为它的目的本来就只是要提供一个全局的Filter注册器。包括GlobalFilters在内,ASP.NET MVC 3.0 RC相较于2.0 RTM增加了10个左右的接口、类或枚举来增强Filter,并且为ControllerActionInvoker增加了2个构造函数来配合这一切。特别是新增加的FilterAttributeFilterProvider、GlobalFilterCollection这两个IFilterProvider,使Filter可以进行缓存,相对于ASP.NET MVC 2.0,性能上有所提升。目前白皮书上只有寥寥几句稍微提到这方面而已。

在今天的Demo中,我实现了一个FilterRegistryFilterProvider:IFilterProvider,它与GlobalFilters比较的优点在于提供了一种可扩展、可配置的Filter注入方式:

1、摒弃在Controller和Action上标记Attribute的方式实现Filter注入的方式,在需要时通过反射来来获取,虽然我对反射并无恶感,既然能提高那么一点点性能,又何乐而不为呢。而且将Filter在Controller外部注入,也去除了与Controller的耦合性。就正如GlobalFilters一样,不需要使用Attribute标记的方式来注入。
2、如果有AController、BController、CDEFG...等,可以指定只在某些Controller注入Filter,需求改变时,可以方便取消注入。正如第一条所说,这一切都不用改动我们已经编译好的Controllers。
3、如果AController的ActionA和BController的ActionC需要某个Filter,可以精确注入。
4、可以让某个或某些Route下的Action注入
5、可以让某个RouteValue等于(不等于、包含)某个值的请求注入Filter。
6、可以让某个DataToken等于(不等于、包含)某个值的请求注入Filter(比如可以给某些area注入)。
7、多个条件组合起来判断,满足高级需求。
8、在系统初始化时,可以像GlobalFilters那样对Filter实例进行缓存,避免不必要的重复创建销毁过程(感谢鹤冲天提醒)
9、您可以很容易的继续扩展注入的条件。

话不多说了,上Demo。另,Demo需要ASP.NET MVC 3.0 RC或更高版本、.Net Framework 4。
下载地址:FilterRegistryDemo
原文地址:https://www.cnblogs.com/alby/p/1906485.html