AOP朝向切面程序编写介绍

AOP这一词坚信大伙儿也没有触碰过多过,可是具体喜欢你们早已有一定的触碰了,就在设计方案方式中。AOP常用的观念实际上和设计方案方式是一样的,即不在改动原编码的状况下统一提升或是改动作用。也有,AOP大多数用在spring里边,可是文中所写的仅仅在MVC中的运用,要留意。

说白了AOP(Aspect Oriented Programming的简称)意思是

朝向切面的程序编写,根据预编译程序方法和运作期动态性代理商完成程序作用的统一维护保养的一种技术性。AOP是OOP的持续,是手机软件开发设计中的一个网络热点,也是Spring架构中的一个关键內容,是涵数式程序编写的一种衍化范型。运用AOP能够对业务流程逻辑性的每个一部分开展防护,进而促使业务流程逻辑性各处分中间的藕合度减少,提升程序的可多次用性,同时提升了开发设计的高效率。

之上是百度搜索百度百科的官方网表述,可是我认为,实际上AOP大量的是一种观念,一种能够动一发而通全身上下的观念,AOP实际上应对的大量是一种愿意的作用或是启用全过程来开展撰写的一种程序体,从它的第一个词Aspect(切面)也便是指的一个层面,还可以掌握到这类方法也便是对于一个层面的完成,这一点实际上和mvc中的global文档很像,也是Spring架构中的一个关键內容,是涵数式程序编写的一种衍化范型。运用AOP能够对业务流程逻辑性的每个一部分开展防护,进而促使业务流程逻辑性各处分中间的藕合度减少,提升程序的可多次用性,同时提升了开发设计的高效率。

次之便是它的预编译程序特性能够非常好的解决一些不正确或是是事先分辨一些状况,这也造成了它在设计方案的情况下在分辨管理权限,统一輸出某一物品层面越来越较为普遍。 能够根据预编译程序方法和运作期动态性代理商完成不在改动源码的状况下给程序动态性统一加上作用的一种技术性。AOP具体是GoF设计方案方式的持续,设计方案方式孳孳不倦追求完美的是启用者和被启用者中间的解耦,提升编码的灵便性和扩展性,AOP能够说也是这类总体目标的一种完成。 上边这句话话也是针对AOP的非常好的阐释。

二、在MVC中的完成

讲过那么多了,要我们来实战演练一一下吧,最先大家必须在vs在建一个mvc的新项目,挑选MVC3或是是4都OK,随后创建一个controller,取名随便,随后创建他的主视图,在主视图上写上非常简单的HelloWorld。

 

 !DOCTYPE html 
 html 
 head 
 title Index /title 
 /head 
 body 
 div 
 a Hello! World /a 
 /div 
 /body 
 /html 

 

下图就是我建立好的MVC处理计划方案和加上好的controller也有view,在view中载入上边的编码以显示信息Hello!World。

运作以后(不容易运作的自主百度搜索)不是是就显示信息出了一个HelloWorld的字眼在网页页面上呢?

好,接下去大家刚开始在建AOP的一个文档随后去应用,最先在本新项目中澳加上一个类,姓名叫FilterPublic,在引入的地区加上using System.Web.Mvc这一引入,随后让这一类承继于ActionFilterAttribute,大伙儿要留意Action这一词,表明这一物品是根据姿势的。

随后大家载入下列编码:

 

 public string Message { get; set; }
 public override void OnActionExecuting(ActionExecutingContext filterContext)
 base.OnActionExecuting(filterContext);
 filterContext.HttpContext.Response.Write( Action实行以前 + Message + br / 
 public override void OnActionExecuted(ActionExecutedContext filterContext)
 base.OnActionExecuted(filterContext);
 filterContext.HttpContext.Response.Write( Action实行以后 + Message + br / 
 public override void OnResultExecuting(ResultExecutingContext filterContext)
 base.OnResultExecuting(filterContext);
 filterContext.HttpContext.Response.Write( 回到Result以前 + Message + br / 
 public override void OnResultExecuted(ResultExecutedContext filterContext)
 base.OnResultExecuted(filterContext);
 filterContext.HttpContext.Response.Write( 回到Result以后 + Message + br / 
 }
这一里边便是Filter开启的各种各样姿势,随后大家在controller里边的默认设置方式做下列改动:

 

 

 [FilterPublic(Message = Action )]
 public ActionResult Index()
 HttpContext.Response.Write( Action已经实行 br / 
 return Content( 已经回到Result br / 
 }
随后在controller的class类上边也加上一句[FilterPublic(Message = Controller )],随后运作,会出現甚么結果呢?

 

 

Action实行以前Action
Action已经实行 
Action实行以后Action
回到Result以前Action
已经回到Result 
回到Result以后Action

 

能看到controller里边的方式在实行以前想去先实行下列大家设定的FilterPublic里边的编码,并且伴随着里边姿势产生時间不一样还可以看得出了全是哪一个方式被开启了。

可是在controller上边写的根据controller的方式却沒有开启,它是为何呢?

实际上这一难题非常简单,便是大家在设定大家的AOP程序的情况下沒有开展主要参数的设定,沒有让filter开展累加的运作,这一情况下大家要是在写的FilterPublic类的上边再加:[AttributeUsage(AttributeTargets.All, AllowMultiple = true)],便可以给你设定的各种各样filter或是累加的filter开展开启了,这一情况下大家再运作一下试一下:

 

Action实行以前Controller
Action实行以前Action
Action已经实行 
Action实行以后Action
Action实行以后Controller
回到Result以前Controller
回到Result以前Action
已经回到Result 
回到Result以后Action
回到Result以后Controller
那样一来,在controller上的Filter也被开启了,因此大家应用AOP的方式只必须在大家自身的写的方式或是网页页面默认设置的载入方式上边写上一个filter类的标识便可以了。

 

那麼,假如大家有一个作用必须全部的网页页面都开启,那样简直也很不便么?别担忧,这一情况下就轮到大家的global文档充分发挥功效了。在global.asax文档下边的RegisterGlobalFilters方式下边申请注册自身写的Filter便可以了:

 

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
 filters.Add(new HandleErrorAttribute());
 //把自身的filter界定满足局的filter
 filters.Add(new FilterPublic() { Message = 全局性 br/ });
}
随后运作,看結果:

 

 

Action实行以前全局性
Action实行以前Controller
Action实行以前Action
Action已经实行 
Action实行以后Action
Action实行以后Controller
Action实行以后全局性
回到Result以前全局性
回到Result以前Controller
回到Result以前Action
已经回到Result 
回到Result以后Action
回到Result以后Controller
回到Result以后全局性
那样全局性的开启也就搞好了(filter中的message仅仅用以标志等级的,宣布用的情况下能够无需界定。)

 

那样一看,假如要想迅速的加上一个全局性都用的方式,只必须在建一个Filter,随后再改一下global文档便可以办来到,不是是很便捷呢。


之上均为自己针对AOP的一些淡淡的科学研究,若有不正确的地区还请阅读者纠正。



扫描二维码分享到微信