博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
asp.net mvc aop
阅读量:2235 次
发布时间:2019-05-09

本文共 1922 字,大约阅读时间需要 6 分钟。

转载自:http://www.cnblogs.com/powerdk/p/4150112.html

一 AOP是什么?

  AOP(Aspect-Oriented Programming),面向切面编程,看着是跟OOP(面向对象编程)挺相近的,但实际上又有什么区别呢?OOP具有封装,继承,多态等东西来定义从上到下这种层次关系,但要想实现从左到右的关系的话就开始有点水土不服了,例如用户的权限控制,操作日志等,这些与我们要实现的核心功能不大有关系的东西散布在我们代码的周边,显示十分不好看。于是我们引入了AOP的模式。

 

        

 

  我们通常在实现一个页面逻辑的时候,通常伴随着操作日志,安全监测,事务处理等几个逻辑,在实现逻辑的时候都要写一大堆这种代码。而AOP就是将这些与主体业务无关,但又有为业务提供服务的逻辑代码封装起来,降低模块之间的耦合度。如图所示中的圆柱体好比如我们的业务流程,aop代表的是那个横向的操作,俗称切面编程。或许上面的这些理论有点头疼,对于AOP我的大体理解是:将那些与业务核心不大相关的杂七杂八的东西独立开,每次实现了业务核心之前或之后,调用一下对应的方法。

 

二 最基本的例子

  AOP这种切面编程能干很多事情,例如验证登陆,权限,性能检测,错误信息记录等等,AOP的目的就是将这些东西分离开来,让开发人员专注与核心关注点,下面用到一个简单的验证身份的例子。

 

  在登陆的时候,我们简单的将用户信息放置于session["User"]中,通常在实现一些关键操作的时候,都会记录用户的信息,所以每次都要判断一下session是否过期,但这动作应该由AOP来做

  

  我们新建一个Attribute(特性,关于这个后续再写一篇,敬请期待),用于验证当前session是否过期,过期的话我们将跳转到登陆页

  

1     public class Authorized: AuthorizeAttribute 2     { 3         public override void OnAuthorization(AuthorizationContext filterContext) 4         { 5             if (filterContext == null) 6             { 7                 throw new ArgumentNullException("filterContext"); 8             } 9             base.OnAuthorization(filterContext);10 11             if (filterContext.HttpContext.Session["User"] == null)12             {13                 filterContext.Result = new RedirectToRouteResult(14                     new RouteValueDictionary15                     {16                         {
"controller", "Account"},17 {
"action", "Login"},18 {
"returnUrl", filterContext.HttpContext.Request.RawUrl}19 });20 return;21 }22 return;23 }24 }

 

  这样的话我们就按照AOP的样子实现了验证身份是否过期,然后我们在控制器使用的时候,只需要在控制器方法头部打上一个便签就可以了,例如:

  

1         [Authorized]2         public ActionResult GetMoreInfo()3         {4             return new EmptyResult();5         }

 

  这样我们就保证了进来GetMoreInfo这个控制器里面的时候,session不为空!引入了AOP,这样我们就更能专注于核心代码编程!

你可能感兴趣的文章
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>
C结构体、C++结构体、C++类的区别
查看>>
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>
绑定CPU逻辑核心的利器——taskset
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>
利用栈实现DFS
查看>>
(PAT 1019) General Palindromic Number (进制转换)
查看>>
(PAT 1073) Scientific Notation (字符串模拟题)
查看>>
(PAT 1080) Graduate Admission (排序)
查看>>
Play on Words UVA - 10129 (欧拉路径)
查看>>
mininet+floodlight搭建sdn环境并创建简答topo
查看>>