前言

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的更多相关文章

  1. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  2. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  3. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  4. 学习AOP之深入一点Spring Aop

    上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...

  5. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  6. .Net中的AOP系列之构建一个汽车租赁应用

    返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...

  7. .NET里简易实现AOP

    .NET里简易实现AOP 前言 在MVC的过滤器章节中对于过滤器的使用就是AOP的一个实现了吧,时常在工作学习中遇到AOP对于它的运用可以说是很熟练了,就是没想过如果自己来实现的话是怎么实现的,性子比 ...

  8. 在.Net中实现自己的简易AOP

    RealProxy基本代理类 RealProxy类提供代理的基本功能.这个类中有一个GetTransparentProxy方法,此方法返回当前代理实例的透明代理.这是我们AOP实现的主要依赖. 新建一 ...

  9. 使用Java原生代理实现AOP

    ### 本文由博主柒.原创,转载请注明出处 ### 完整源码下载地址 [https://github.com/MatrixSeven/JavaAOP](https://github.com/Matri ...

  10. 【开源】.Net Aop(静态织入)框架 BSF.Aop

    BSF.Aop .Net 免费开源,静态Aop织入(直接修改IL中间语言)框架,类似PostSharp(收费): 实现前后Aop切面和INotifyPropertyChanged注入方式. 开源地址: ...

随机推荐

  1. 【微信小程序常识】如何绑定微信小程序体验者

    转自:https://blog.csdn.net/futruejet/article/details/53223826 一.操作步骤 (1)打开微信小程序公众平台->点击右边菜单[用户身份]-& ...

  2. 抛java.lang.NoClassDefFoundError: org.joda.time.ReadablePeriod错误

    转自:http://www.codeorg.cn/article/detail/qa/542 在进行activiti环境搭建时总是抛出java.lang.NoClassDefFoundError: o ...

  3. C++Primer笔记-----day06

    ================================================================day06=============================== ...

  4. UNITY IMGUI

    这几天研究OPENGL时,想找一个UI库来用,发现了IMGUI,到网上搜索评估中,突然发现它似乎和UNITY有关系. UNITY文档中提到过IMGUI,不知道是不一个东西,仔细看了下文档,果然是.原文 ...

  5. .NET 等宽、等高、等比例、固定宽高生成缩略图 类

    #region 根据原图片生成等比缩略图 /// <summary> /// 根据源图片生成缩略图 /// </summary> /// <param name=&quo ...

  6. Linux实战教学笔记20:初级阶段结束,中级阶段起航

    第二十节 第一阶段结束第二阶段起航 标签(空格分隔): Linux实战教学笔记-陈思齐 一,承上 Linux实战教学笔记的基础核心能力阶段也就是第一阶段到此也就告一段落了.如果同学们能基本全都掌握,再 ...

  7. keepalived之vrrp_script详解

    通常情况下,利用keepalived做热备,其中一台设置为master,一台设置为backup.当master出现异常后,backup自动切换为master.当backup成为master后,mast ...

  8. Makefile 自动搜索 c 和 cpp 文件, 并生成 .a 静态库文件

    最近 又弄linux 下的 .a 静态库编译, 于是想 做个 一劳永逸的Makefile, 经过一番折腾, 最后成功了 只需要 改两个 参数 就可以执行了(MYLIB 和 VPATH), 代码 如下: ...

  9. yum基本用法与修改源

    一.yum简介 yum,是Yellow dog Updater Modified的简称,起初是由yellow dog这一发行版的开发者Terra Soft研发,用python写成,那时还叫做yup(y ...

  10. Linux Bash脚本编程语言中的美学与哲学

    我承认,我再一次地当了标题党.但是不可否认,这一定是一篇精华随笔.在这一篇中,我将探讨Bash脚本语言中的美学与哲学. 这不是一篇Bash脚本编程的教程,但是却能让人更加深入地了解Bash脚本编程,更 ...