也说AOP
前言
1.引言
2.Aop概念
3.Aop实践
4.总结
一、引言
对于初入行的小白来讲,aop,ioc这两个程序设计思想总是傻傻分不清,不知道是个什么东东?别人再一谈各种框架更是云里雾里。。。博主今天带大家且先入个门,哈哈;)
二、Aop概念
AOP为Aspect Oriented Programming的缩写,译为:面向切面编程。通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
三、Aop实践
在开发中,相信大家都遇到过验证用户权限的事情,那是不是需要在每个界面上都要加个判断呢?假如通过验证,就执行某某业务逻辑,不通过,就跳转或者提示啊 怎么怎么样。。。

示图一
从程序设计的角度来考虑,验证用户 这件事情我们是不是可以分离出去呢,因为都是相同的嘛,减少重复,也是在不修改源代码的情况下动态统一添加功能;另一个方面可以 让一个对象尽可能的多关注自己的业务逻辑。这对于建立一个松耦合、可复用、可扩展性的系统是非常有利的。
下面介绍静态代理和动态代理实现AOP。(IL编织实现AOP这篇暂时先不介绍。。。)
创建公用的Model类
public class User
{
public int Age { get; set; }
public string Name { get; set; }
}
代理模式 实现静态代理
//代理模式 实现静态代理
class DecoratorAop
{
public static void Show()
{
User user = new User
{
Age = ,
Name = "Michael"
};
IUserProcesser processer = new UserProcesser();
processer.RegUser(user);
IUserProcesser userProcesser = new UserProcesserDecorator(processer);
userProcesser.RegUser(user);
}
public interface IUserProcesser
{
void RegUser(User user);
}
public class UserProcesser : IUserProcesser
{
public void RegUser(User user)
{
Console.WriteLine($"注册用户,年龄为{user.Age},姓名{user.Name}");
}
}
public class UserProcesserDecorator : IUserProcesser
{
public IUserProcesser userProcesser; public UserProcesserDecorator(IUserProcesser processer)
{
userProcesser = processer;
}
public void RegUser(User user)
{
BeforeProcess();
Console.WriteLine($"注册用户,年龄为{user.Age},姓名{user.Name}");
AfterProcess();
}
public void BeforeProcess()
{
Console.WriteLine("方法执行前");
}
public void AfterProcess()
{
Console.WriteLine("方法执行后");
}
} }
class Program
{
static void Main(string[] args)
{
DecoratorAop.Show();
Console.ReadLine();
}
}

使用.NET Remoting/RealProxy 实现动态代理
class ProxyAop
{
public static void Show()
{
User user = new User
{
Age = ,
Name = "Michael"
};
UserProcessor userProcessor = TransparentProxy.Create<UserProcessor>();
userProcessor.RegUser(user); }
/// <summary>
/// 真实代理
/// </summary>
/// <typeparam name="T"></typeparam>
public class MyRealProxy<T> : RealProxy
{
private T tTarget;
public MyRealProxy(T target)
:base(typeof(T))
{
tTarget = target;
} public override IMessage Invoke(IMessage msg)
{
BeforeProcess();
IMethodCallMessage methodCallMessage = (IMethodCallMessage)msg;
object returnValue= methodCallMessage.MethodBase.Invoke(this.tTarget, methodCallMessage.Args);
AfterProcess();
return new ReturnMessage(returnValue,new object[],,null, methodCallMessage);
}
public void BeforeProcess()
{
Console.WriteLine("方法执行前");
}
public void AfterProcess()
{
Console.WriteLine("方法执行后");
}
}
/// <summary>
/// 透明代理
/// </summary>
public static class TransparentProxy
{
public static T Create<T>()
{
T instance= Activator.CreateInstance<T>();
MyRealProxy<T> myRealProxy = new MyRealProxy<T>(instance);
T transparentProxy= (T)myRealProxy.GetTransparentProxy();
return transparentProxy;
}
}
public interface IUserProcessor
{
void RegUser(User user);
}
public class UserProcessor :MarshalByRefObject, IUserProcessor
{
public void RegUser(User user)
{
Console.WriteLine($"用户已注册,年龄{user.Age},姓名{user.Name}");
}
} }
class Program
{
static void Main(string[] args)
{
ProxyAop.Show();
Console.ReadLine();
}
}

使用Castle\DynamicProxy 实现动态代理
public class CastleProxyAop
{
public static void Show()
{
User user = new User
{
Age = ,
Name = "Michael"
};
ProxyGenerator proxyGenerator = new ProxyGenerator();
MyInterceptor myInterceptor = new MyInterceptor();
UserProcessor userProcessor= proxyGenerator.CreateClassProxy<UserProcessor>(myInterceptor);
userProcessor.RegUser(user);
userProcessor.GetID();
}
public interface IUserProcessor
{
void RegUser(User user);
void GetID();
}
public class UserProcessor : IUserProcessor
{
public virtual void RegUser(User user)
{
Console.WriteLine($"用户已注册,年龄{user.Age},姓名{user.Name}");
}
public virtual void GetID()
{
Console.WriteLine($"这是1");
}
}
public class MyInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
PreProceed();
invocation.Proceed();
PostProceed();
}
public void PreProceed()
{
Console.WriteLine($"方法执行前");
}
public void PostProceed()
{
Console.WriteLine($"方法执行后");
}
} }
class Program
{
static void Main(string[] args)
{
CastleProxyAop.Show();
Console.ReadLine();
}
}

使用Entlib\PLAB Unity实现动态代理
public class UnityAop
{
public static void Show()
{
User user = new User
{
Age = ,
Name = "Michael"
};
IUnityContainer unityContainer = new UnityContainer(); //声明一个容器
unityContainer.RegisterType<IUserProcessor, UserProcessor>(); //声明unityContainer并注册IUserProcessor unityContainer.AddNewExtension<Interception>().Configure<Interception>()
.SetInterceptorFor<IUserProcessor>(new InterfaceInterceptor());
IUserProcessor userProcessor = unityContainer.Resolve<IUserProcessor>();
userProcessor.RegUser(user);
} #region //特性对应的行为
public class UserHandler : ICallHandler
{
public int Order { get; set; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{ User user = input.Inputs[] as User;
if(user.Age<)
{
return input.CreateExceptionMethodReturn(new Exception("年龄小于1岁禁止入内"));
}
Console.WriteLine($"参数检测无误");
IMethodReturn methodReturn = getNext()(input, getNext);
return methodReturn;
}
} public class LogHandler : ICallHandler
{
public int Order { get; set; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{ User user = input.Inputs[] as User;
string message = $"年龄{user.Age},姓名{user.Name}";
Console.WriteLine($"日志已记录,message:{message},time:{DateTime.Now}");
return getNext()(input, getNext);
}
} public class ExceptionHandler : ICallHandler
{
public int Order { get; set; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
IMethodReturn methodReturn = getNext()(input, getNext);
if(methodReturn.Exception==null)
{
Console.WriteLine("无异常");
}
else
{
Console.WriteLine($"异常:{methodReturn.Exception.Message}");
}
return methodReturn;
}
}
#endregion #region //特性
public class UserHandlerAttribute : HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
ICallHandler callHandler = new UserHandler { Order = this.Order };
return callHandler;
}
}
public class LogHandlerAttribute : HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
return new LogHandler { Order = this.Order };
}
}
public class ExceptionHandlerAttribute : HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
ICallHandler callHandler = new ExceptionHandler { Order = this.Order };
return callHandler;
}
}
#endregion #region //业务
[ExceptionHandlerAttribute(Order =)]
[LogHandlerAttribute(Order =)]
[UserHandlerAttribute(Order =)]
public interface IUserProcessor
{
void RegUser(User user);
}
public class UserProcessor : IUserProcessor
{
public void RegUser(User user)
{
Console.WriteLine($"用户已注册,年龄{user.Age},姓名{user.Name}");
}
}
#endregion
}
class Program
{
static void Main(string[] args)
{
UnityAop.Show();
Console.ReadLine();
}
}

四、总结
AOP的优点:
1.解耦,将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑中分离出去,当这些行为改变时不影响业务逻辑。
2.将通用功能从业务逻辑中抽离出来,提高代码复用性,灵活性,可扩展性。
AOP与OOP的区别:

OOP讲究“一切皆为对象”,使用类将世间万事万物的状态和行为模块化,封装继承多态。
AOP是将切面(Aspect)模块化。纵向切入,对业务处理过程中的切面进行提取,以获得逻辑过程中各部分之间低耦合的隔离效果,使应用对象更加关注业务逻辑,实现解耦,提供程序灵活性及可扩展性。
适用场景:日志记录,性能统计,安全控制,事务处理,异常处理。
参考:
http://www.cnblogs.com/landeanfen/p/4782370.html
http://www.cnblogs.com/jin-yuan/p/3811077.html
http://wayfarer.cnblogs.com/articles/241024.html
也说AOP的更多相关文章
- 基于spring注解AOP的异常处理
一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- 学习AOP之透过Spring的Ioc理解Advisor
花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...
- 学习AOP之深入一点Spring Aop
上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...
- 学习AOP之认识一下Spring AOP
心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...
- .Net中的AOP系列之构建一个汽车租赁应用
返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...
- .NET里简易实现AOP
.NET里简易实现AOP 前言 在MVC的过滤器章节中对于过滤器的使用就是AOP的一个实现了吧,时常在工作学习中遇到AOP对于它的运用可以说是很熟练了,就是没想过如果自己来实现的话是怎么实现的,性子比 ...
- 在.Net中实现自己的简易AOP
RealProxy基本代理类 RealProxy类提供代理的基本功能.这个类中有一个GetTransparentProxy方法,此方法返回当前代理实例的透明代理.这是我们AOP实现的主要依赖. 新建一 ...
- 使用Java原生代理实现AOP
### 本文由博主柒.原创,转载请注明出处 ### 完整源码下载地址 [https://github.com/MatrixSeven/JavaAOP](https://github.com/Matri ...
- 【开源】.Net Aop(静态织入)框架 BSF.Aop
BSF.Aop .Net 免费开源,静态Aop织入(直接修改IL中间语言)框架,类似PostSharp(收费): 实现前后Aop切面和INotifyPropertyChanged注入方式. 开源地址: ...
随机推荐
- Django xadmin的使用 (三)
关于报错: 1.在页面添加好新的用户后登录报错 解决方法: 新建一个app,名叫app D:\myfiles\study\python\django\datas>python manage.py ...
- ffmpeg打开视频解码器失败:Could not find codec parameters for stream 0 (Video: h264): unspecified size
在使用ffmpeg进行拉流分离音视频数据再解码播放操作的时候: 有时候经常会报错: Could not find codec parameters for stream 0 (Video: h264) ...
- PHP - 闭合标签
最最开始的时候经常遇到这个问题,就是如果一个文件里面全部都是php代码的话,我写了前闭合和后闭合的时候,文件一多就容易报错,老是说什么有关输出的错误,貌似大概就是header已经发了. 手册上面这个样 ...
- 解决编译错误 implicit declaration of function 'strptime'
根据man手册,在文件中加上以下定义,应该可以去处该warning #define _XOPEN_SOURCE /* glibc2 needs this */ #inclu ...
- ie8、9 post 跨域
//显示浮层postAjax:function(url,param,callback){ var loadScore = layer_.load(1,{shade: [0.8,'#393D49']}) ...
- 在SharePoint解决方案中使用JavaScript (0)
随着Web前段技术(JavaScript/HTML5)的日益发扬光大,在Web应用程序中,我们开始更多的使用JavaScript.很多以往是放在服务器上运行的逻辑,现在都开始逐渐的向前段转移.这种趋势 ...
- 安装kali linux 2017.1 【二、安装VMware-tools 以及相关问题处理】
一.基本步骤: 1.VMware Workstation菜单栏中,选择“虚拟机”,”安装VMware Tools...“. 2.挂载VMware Tools安装程序到/mnt/cdrom/. mkdi ...
- 523. Continuous Subarray Sum是否有连续和是某数的几倍
[抄题]: Given a list of non-negative numbers and a target integer k, write a function to check if the ...
- 2-字符串模拟- URL映射
问题描述 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django.Ruby on Rails 等 ...
- 由浅到深理解ROS(5)- launch启动文件的理解与编写
ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系统都可 ...