MVC中的Filte 简单又优雅的实现了AOP ,在日志,权限,缓存和异常处理等方面用的比较多。但本文不是讨论Filter这些功能点,而是总结Filter实现的方式。说实现也不太准确,也就是它的呈现方式。自带有四种Filter(借用了Liam wang的图)

      Asp.Net MVC  Filter 实现方式和作用范围控制

      如果要实现自己的Filter,根本还是在于是实现第二项的接口。

      实现方式:

一、特性式

      从上图可以看到,Filter的默认实现方式就是带有Attribute后缀的,有了Attribute,我们就可以将我们的Filter像标签一样的贴在方法或者控制器的上方。这样直观又简洁。最简单的自定义就是继承默认Filter。比如我定义一个LogFilter,继承于ActionFilter记录方法名,参数,和备注信息。

   public class LogFilterAttribute : ActionFilterAttribute
    {
        public string Message { get; set; }
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var cname = filterContext.RouteData.Values["controller"].ToString();
            var actionName = filterContext.RouteData.Values["action"].ToString();
            var str = filterContext.ActionParameters.Aggregate("", (current, actionParameter) => current + (actionParameter.Key + ":" + actionParameter.Value));
            var message = string.Format("控制器:{0} 方法:{1} 参数:{2},执行时间:{3},备注信息:{4}", cname, actionName, str, DateTime.Now,
                Message);
            Logger.Debug(message);
        }
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
        }
    }

 调用的时候,贴在指定的方法上面就可以了。(当然你命名的时候可以把“Filter”拿掉),当然也可以分别去继承接口 比如public class MyLogAttribute : FilterAttribute, IActionFilter

  [LogFilter(Message = "管理员新增产品")]
  public ActionResult Create(Product product){
  //..... 
 }

二、控制器实现

  查看我们的Controller类,它本身是继承于IActionFilter 等这些接口的,同样,我们在控制器里面实现了这些方法也能发挥Filter的作用。没了Attribute,继续AOP

 Asp.Net MVC  Filter 实现方式和作用范围控制

  public class UserController : Controller
    {
       //这里实现一个方法  
protected override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write("控制器实现,Action正在执行"); }
//..... }

 这样在当前控制器下的所有方法执行时,页面都会输出这样一句话。

Asp.Net MVC  Filter 实现方式和作用范围控制

这种做法的作用不大,可以将前控制器作为一个控制器基类。  

三、依赖注入式

   这种方式意义不大,感觉绕了大弯子,而且不灵活。权当熟悉一下Ninject。

   1.创建接口并实现。(IOC总是离不开接口)

  public interface IMessageProvider
    {
        string Message { get; }
    }

    public class SimpleMessageProvider : IMessageProvider
    {
        public string Message
        {
            get
            {
                return "Hello IOC";
            }
        }
    }
View Code

2.实现一个自定义Filter

public class DIMessageAttribute : FilterAttribute, IActionFilter {
     
        [Inject]//告诉我们的DI容器 这个属性需要依赖注入来获取实例
        public IMessageProvider Provider { get; set; }
        
       public void OnActionExecuting(ActionExecutingContext filterContext)
       {
          filterContext.HttpContext.Response.Write(string.Format("[Before Action:{0}]",Provider.Message));
       }

       public void OnActionExecuted(ActionExecutedContext filterContext)
       {
           filterContext.HttpContext.Response.Write(string.Format("[After Action:{0}]", Provider.Message));
       }
   }
View Code

相关文章:

  • 2021-06-11
  • 2022-12-23
  • 2021-07-06
  • 2021-08-28
  • 2021-12-02
  • 2021-09-06
  • 2021-08-20
猜你喜欢
  • 2021-09-30
  • 2022-01-01
  • 2021-09-22
  • 2021-12-12
  • 2021-07-08
  • 2021-08-25
相关资源
相似解决方案