也说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注入方式. 开源地址: ...
随机推荐
- Oracle11gR2导入导出实战之物化视图prebuilt
源实例上创建表 物化视图 oracle@localhost admin]$ sqlplus system/oracle@orcl2 SQL*Plus: Release 11.2.0.4.0 Produ ...
- Keepalived 资源监控
简介: 作为一个高可用集群软件,Keepalived 没有 Heartbeat .RHCS 等专业的高可用集群软件功能强大,它不能够实现集群资源的托管,也不能实现对集群中运行服务的监控,好在 Keep ...
- linux下mysql的源码安装
mysql有多中安装方法,本文只涉及编译安装,对其他方法感兴趣的可以自行百度. 1.首先获取mysql软件安装包,这里用wget下载 [root@localhost ~]# wget http://d ...
- DEV 打印功能
Dev13.1 用的是DocumentViewer,上面的一排按钮,是自动生成的,生成方法为:加了DocumentViewer后,控件右上角有个小三角,点一下,在弹出框中选择"Create ...
- kali linux: 网卡监听及扫描网络
一.网卡监听: kali不支持内置网卡,仅仅支持usb网卡.我用的虚拟机.首先在虚拟机的可移动设备里打开usb网卡的连接,执行ifconfig命令,如下: eth0接口是本地有线网卡信息,lo接口是本 ...
- Nginx源码完全注释(4)ngx_queue.h / ngx_queue.c
队列头文件ngx_queue.h #include <ngx_config.h> #include <ngx_core.h> #ifndef _NGX_QUEUE_H_INCL ...
- python基础之-数据类型
Python3 数字(Number) Python 数字数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变数字数据类型得值,将重新分配内存空间. 以下实例在变量赋值时 Number 对 ...
- Go语言特性
1.入口,go有且只有一个入口函数,就是main函数 liteide (IDE)的 一个工程(文件夹)只能有且只有一个main函数 package main import "fmt" ...
- C#读取EXCEL到内存
public class ExcelUtils { private static string strcon = "Server=48.12.1.28;initial catalog=NBS ...
- Java Decompiler(Java反编译工具)
参考:http://blog.csdn.net/yulei_qq/article/details/24175547 Java Decompiler可以对整个jar包进行反编译,也可以将其集成到ecli ...