.net Filter 和 代理模式杂谈
如下只是自己的联想,部分功能并未实现,
在mvc中,我们需要去写日志,处理异常,.net 中也提供了对应的Filter让我们实现AOP,
.net中提供了基本的Authorize,Action, Result,Exception四种类型的Filter
参考 MSDN https://docs.microsoft.com/en-us/previous-versions/aspnet/gg416513(v=vs.98)
最直观的就是 OnActionExecuting和 OnActionExecuted 分别是在action执行前后去执行
闲来简单的看下静态代理
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 RealSubject subject = new RealSubject(); 6 Proxy p = new Proxy(subject); 7 p.Request(); 8 Console.ReadLine(); 9 } 10 } 11 12 public interface ISubject 13 { 14 void Request(); 15 } 16 17 public class RealSubject : ISubject 18 { 19 public void Request() 20 { 21 Console.WriteLine("RealSubject"); 22 } 23 } 24 25 public class Proxy : ISubject 26 { 27 private ISubject _subject; 28 public Proxy(ISubject subject) 29 { 30 this._subject = subject; 31 } 32 public void Request() 33 { 34 Console.WriteLine("before..."); 35 _subject.Request(); 36 Console.WriteLine("after..."); 37 } 38 }
我们可以在执行Request的时候去执行一些准备操作,联想到mvc的action,我们可以处理传参,处理请求,我们可以将结果格式化。
在执行controller之前,我们重写IActionFilter的OnActionExcuting方法,看到Context结尾的参数我们大概可以联想到,这个参数包含了请求的上下文,F12转定义我们可以看到 ActionArguments这个属性,并且是只读的,如果对应的acion有参数我们可以拦截参数,当然这个我觉得还是做成attribute,不呀做成全局的,身份验证是需要做全局验证。
1 public override void OnActionExecuting(ActionExecutingContext context) 2 { 3 base.OnActionExecuting(context); 4 }