也说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注入方式. 开源地址: ...
随机推荐
- Linux实战教学笔记46:NoSQL数据库之redis持久化存储 (二)
第3章 Redis数据类型详解 3.1 Redis键/值介绍 Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如"foo"的简单字符串到一个JPG ...
- Android中Activity的四种启动方式
谈到Activity的启动方式必须要说的是数据结构中的栈.栈是一种只能从一端进入存储数据的线性表,它以先进后出的原则存储数据,先进入的数据压入栈底,后进入的数据在栈顶.需要读取数据的时候就需要从顶部开 ...
- 详细探究Spark的shuffle实现
Background 在MapReduce框架中,shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环 节,shuffle的性能高低直接影响 ...
- MySQL多表查询回顾
----------------------siwuxie095 MySQL 多表查询回顾 以客户和联系人为例(一对多) 1.内连接 /*内连接写法一*/ select * from t_custom ...
- int类型与char类型的转换
---------siwuxie095 Java对char类型的数据在底层是按int类型来处理的 (只是显示出来仍然是字符型) 1.int类型与char ...
- Windows服务器常用的性能计数器
Windows常用性能计数器总结 基础监控: 1.SQL Server Buffer: Buffer Cache Hit Ratio 这是一个很重要查看内存是否不足的参数.SQL Server Buf ...
- Java 8特性
1. Java8的新特性 1.1. Lambda表达式和函数式接口 最简单的Lambda表达式可以用逗号分隔的参数列表.->符号和功能语句块来表示.示例如下: Arrays.asList( &q ...
- Redis初学笔记
1.官网概述 Redis is an open source (BSD licensed), in-memory data structure store, used as database, cac ...
- 敏捷开发之XP
敏捷方法论有一个共同的特点,那就是都将矛头指向了“文档”,它们认为传统的软件工程方法文档量太“重”了,称为“重量级”方法,而相应的敏捷方法则是“轻量级”方法.正是因为“轻量级”感觉没有什么力量,不但不 ...
- CALayer, CoreGraphics与CABasicAnimation介绍
今天我们来看一下CALayer.CoreGraphics和CABasicAnimation.这些东西在处理界面绘制.动画效果上非常有用. 本篇博文就讲介绍CALayer的基本概念,使用CoreGrap ...