Aspect Oriented Programming面向切面编程
I简介
Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题。AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。比如我们最常见的就是权限验证,日志记录。
举个例子,我们现在提供例了获取数据的一个方法,但是我们希望并不是所有人都有权限调用。如果按照传统的OOP的实现的话,我们实现了获取数据获取数据,同时为了要进行权限验证的的话,那我们在实现该方法中要添加验证权限的代码。这样的话,假如我们要实现的功能有多个呢?那就要在每个实现的类都添加这些验证权限的代码。这样做的话就会有点繁琐,而且每个实现类都与验证权限的行为紧耦合,违反了面向对象的规则。那么怎样才能把验证权限的行为与业务处理过程中分离出来呢?看起来好像就是获取数据的方法自己在进行,但却是背后权限验证为这些行为进行验证,并且方法调用者都不知道存在这些权限验证过程,这就是我们要讨论AOP的目的所在。AOP的编程,好像就是把我们在某个方面的功能提出来与一批对象进行隔离,这样与一批对象之间降低了耦合性,可以就某个功能进行编程。
II代码实现:
1. 类标签声明
/// <summary>
/// 支持权限验证标签
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class PermissionCheckAttribute :ContextAttribute
{
public PermissionCheckAttribute()
: base("PermissionCheck")
{ }
public override voidGetPropertiesForNewContext(IConstructionCallMessage ccm)
{
ccm.ContextProperties.Add(newPermissionCheckProperty());
}
}
2. 验证属性声明
public class PermissionCheckProperty :IContextProperty,
IContributeObjectSink
{
#region IContributeObjectSinkimplementation
public IMessageSinkGetObjectSink(MarshalByRefObject o,
IMessageSink next)
{
return new SecurityAspect(next);
}
#endregion // IContributeObjectSinkimplementation
#region IContextProperty implementation
// Implement Name, Freeze,IsNewContextOK
public string Name
{
get { return"PermissionCheckProperty"; }
}
public void Freeze(Context newContext)
{
}
public bool IsNewContextOK(ContextnewCtx)
{
return true;
}
#endregion //IContextPropertyimplementation
}
3. 验证属性上下文声明
public class PermissionCheckProperty :IContextProperty,
IContributeObjectSink
{
#region IContributeObjectSinkimplementation
public IMessageSinkGetObjectSink(MarshalByRefObject o,
IMessageSink next)
{
return new SecurityAspect(next);
}
#endregion // IContributeObjectSinkimplementation
#region IContextProperty implementation
// Implement Name, Freeze,IsNewContextOK
public string Name
{
get { return"PermissionCheckProperty"; }
}
public void Freeze(Context newContext)
{
}
public bool IsNewContextOK(ContextnewCtx)
{
return true;
}
#endregion //IContextProperty implementation
}
4. 函数标签声明
/// <summary>
/// 功能描述标签类
/// </summary>
[AttributeUsage(AttributeTargets.All,AllowMultiple = false, Inherited = true)]
public class FeatureDescriptionAttribute :Attribute
{
/// <summary>
/// 功能编号
/// </summary>
public string Guid { get; set; }
/// <summary>
/// 功能描述
/// </summary>
public string Description { get; set; }
public FeatureDescriptionAttribute() {}
public FeatureDescriptionAttribute(stringname, string description)
{
this.Guid = name;
this.Description = description;
}
}
5.验证实现具体帮助类
/// <summary>
/// 权限验证帮助类
/// </summary>
public class PowerHelper
{
/// <summary>
/// 权限验证方法实现
/// </summary>
/// <param name="guid">功能编号</param>
/// <paramname="description">功能描述</param>
public static voidPermissionCheck(string guid, string description)
{
//TODO:此处查询数据库,做权限验证
if (guid =="04C4DFC7-9EDD-4A5D-9029-3EDCD5977163")
{
//拥有权限,正常
MessageBox.Show("权限检测通过");
}
else
{
//没有权限
throw newUnauthorizedAccessException("访问被拒绝,当前用户不具有操作此功能的权限!");
}
}
}
III具体使用例子
1. 功能函数声明
[PermissionCheck]
public class ControlDemoApi :ContextBoundObject
{
[FeatureDescription("04C4DFC7-9EDD-4A5D-9029-3EDCD5977163","功能1")]
public void Function1()
{
MessageBox.Show("成功的执行了功能1!");
}
[FeatureDescription("2FCFA71B-D492-4F88-8A75-985AC70BA161","功能2")]
public void Function2()
{
MessageBox.Show("成功的执行了功能2!");
}
}
2.调用功能函数
ControlDemoApi apiDemo =new ControlDemoApi(); apiDemo.Function1(); apiDemo. Function2();
3.说明
如2中描述,在执行apiDemo. Function1();之前会自动调用验证实现具体帮助类中的PermissionCheck(string guid, string description)方法。执行结果为 首先弹出消息权限检测通过,然后弹出消息 成功的执行了功能1!
如2中描述,在执行apiDemo. Function2 ();之前会自动调用验证实现具体帮助类中的PermissionCheck(stringguid, string description)方法。执行结果为 访问被拒绝,抛出异常 当前用户不具有操作此功能的权限!
Aspect Oriented Programming面向切面编程的更多相关文章
- Java实战之03Spring-03Spring的核心之AOP(Aspect Oriented Programming 面向切面编程)
三.Spring的核心之AOP(Aspect Oriented Programming 面向切面编程) 1.AOP概念及原理 1.1.什么是AOP OOP:Object Oriented Progra ...
- Aspect Oriented Programming
AOP(Aspect Oriented Programming),面向切面编程(也叫面向方面)是目前软件开发中的一个热点.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度 ...
- Java笔记——面向切面编程(AOP模式)
原文:http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html Aspect Oriented Programming 面向切面 ...
- Spring(三)--AOP【面向切面编程】、通知类型及使用、切入点表达式
1.概念:Aspect Oriented Programming 面向切面编程 在方法的前后添加方法 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动 ...
- Spring AOP(面向切面编程)
一.AOP简介 1.AOP概念:Aspect Oriented Programming 面向切面编程 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动态代理 …… 3.情景举例 ①数学 ...
- Spring AOP 面向切面编程相关注解
Aspect Oriented Programming 面向切面编程 在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业. ...
- Spring详解篇之 AOP面向切面编程
一.概述 Aop(aspect oriented programming面向切面编程),是spring框架的另一个特征.AOP包括切面.连接点.通知(advice).切入点(pointCut) . 1 ...
- AOP面向切面编程笔记
1.AOP概念:Aspect Oriented Programming 面向切面编程 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动态代理 …… 3.情景举例 ①数学计算器接口[Ma ...
- java aop面向切面编程
最近一直在学java的spring boot,一直没有弄明白aop面向切面编程是什么意思.看到一篇文章写得很清楚,终于弄明白了,原来跟python的装饰器一样的效果.http://www.cnblog ...
随机推荐
- [Angular] FormBuildAPI
Using FormBuilder API can simply our code, for example we want to refactor following code by using F ...
- protobuf入门教程
1.简介和安装 2.消息类型 3.proto3 与 proto2 的区别 4.常用序列化/反序列化接口 5.repeated限定修饰符 6.枚举(enum).包(package) 7.导入定义(imp ...
- style.height、offsetHeight、clientHeight、scrollHeight的差别
style.height 包含元素的滚动栏,不包含边框 clientHeight 不包含元素的滚动栏和边框 offsetHeight 包含元素的滚动栏和边框 scrollHeight offsetHe ...
- 利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)
利用QPainter绘制各种图形 Qt的二维图形引擎是基于QPainter类的.QPainter既可以绘制几何形状(点.线.矩形.椭圆.弧形.弦形.饼状图.多边形和贝塞尔曲线),也可以绘制像素映射.图 ...
- 编写ATL控件的简单做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 ATL并不像MFC库那样提供了很多的控件窗口类,因此要使用ATL的话需要自己去封装.封装的做法很简单.比如现在我需要一 ...
- NOIP模拟 Math - 数学
题目大意: 给定a,n(\(a \le 1e9, n\le30\)),求有多少\(b(1 \le b \le 2^n)\)满足:\(a^b \equiv b^a(mod 2^n)\). 题目分析: 数 ...
- 百度UEditor上传图片-再再总结一次
本周,CSDN有个网友遇到了百度UEditor上传问题,最后商定付50元钱,我帮他解决这个问题. 他最初想自己搞定这个问题,结果搞了好多次,好几天,还是没能解决. 2015年1月17日8: ...
- springMvc中restful风格的api路径中把小数点当参数,SpringMvc中url有小数点
在springMvc web项目中restful风格的api路径中有小数点会被过滤后台拿不到最后一个小数点的问题, 有两种解决方案: 1:在api路径中加入:.+ @RequestMapping(&q ...
- TensorFlow 学习(八)—— 梯度计算(gradient computation)
maxpooling 的 max 函数关于某变量的偏导也是分段的,关于它就是 1,不关于它就是 0: BP 是反向传播求关于参数的偏导,SGD 则是梯度更新,是优化算法: 1. 一个实例 relu = ...
- C# 使用Emit深克隆
原文:C# 使用Emit深克隆 有人问,复制一个类所有属性到另一个类有多少方法?这也就是问深克隆有多少个方法,容易想的有三个.直接复制,反射复制,序列化复制.但是性能比较快的有表达式树复制 IL复制两 ...