老端方,还是先看官方解释:AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方法和运行期动态代办代理实此刻不改削源代码的情况下给措施动态统一添加成果的一种技术。它是一种新的要领论,它是对传统OOP编程的一种增补。OOP是存眷将需求成果划分为差此外并且相对独立,封装良好的类,并让它们有着属于本身的行为,依靠担任和多态等来界说相互的关系;AOP是但愿能够将通用需求成果从不相关的类傍边疏散出来,能够使得很多类共享一个行为,一旦产生变革,不必改削很多类,而只需要改削这个行为即可。AOP是使用切面(aspect)将横切存眷点模块化,OOP是使用类将状态和行为模块化。在OOP的世界中,措施都是通过类和接口组织的,使用它们实现措施的核心业务逻辑是十分合适。但是对付实现横切存眷点(跨越应用措施多个模块的成果需求)则十分费力,好比日志记录,权限验证,异常拦截等。
博主的理解:AOP就是将公用成果提取出来,如果以后公用成果的需求产生变革,只需要窜改公用的模块的代码即可,多个挪用的处所则不需要窜改。所谓面向切面,就是只存眷通用成果,而不存眷业务逻辑。实现方法一般是通过拦截。好比,我们随便一个Web项目根基都有的权限验证成果,进入每个页面前城市校验当前登录用户是否有权限检察该界面,我们不成能说在每个页面的初始化要领里面都去写这段验证的代码,这个时候我们的AOP就派上用场了,AOP的机制是预先界说一组特性,使它具有拦截要领的成果,可以让你在执行要领之前和之后做你想做的业务,而我们使用的时候只需要的对应的要领或者类界说上面加上某一个特性就好了。
二、使用AOP的优势博主感受它的优势主要表示在:
1、将通用成果从业务逻辑中抽离出来,可以省略大量反复代码,有利于代码的操纵和维护。
2、在软件设计时,抽出通用成果(切面),有利于软件设计的模块化,降低软件架构的庞大度。也就是说通用的成果都是一个单独的模块,在项目的主业务里面是看不到这些通用成果的设计代码的。
三、AOP的简单应用为了说明AOP的事情道理,博主筹算先从一个简单的例子开始,通过静态拦截的方法来了解AOP是如何事情的。
1、静态拦截public class Order { public int Id { set; get; } public string Name { set; get; } public int Count { set; get; } public double Price { set; get; } public string Desc { set; get; } } public interface IOrderProcessor { void Submit(Order order); } public class OrderProcessor : IOrderProcessor { public void Submit(Order order) { Console.WriteLine("提交订单"); } } public class OrderProcessorDecorator : IOrderProcessor { public IOrderProcessor OrderProcessor { get; set; } public OrderProcessorDecorator(IOrderProcessor orderprocessor) { OrderProcessor = orderprocessor; } public void Submit(Order order) { PreProceed(order); OrderProcessor.Submit(order); PostProceed(order); } public void PreProceed(Order order) { Console.WriteLine("提交订单前,进行订单数据校验...."); if (order.Price < 0) { Console.WriteLine("订单总价有误,请从头查对订单。"); } } public void PostProceed(Order order) { Console.WriteLine("提交带单后,进行订单日志记录......"); Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "提交订单,订单名称:" + order.Name + ",订单价格:" + order.Price); } }
挪用代码:
static void Main(string[] args) { Order order = new Order() { Id = 1, Name = "lee", Count = 10, Price = 100.00, Desc = "订单测试" }; IOrderProcessor orderprocessor = new OrderProcessorDecorator(new OrderProcessor()); orderprocessor.Submit(order); Console.ReadLine(); }
得到功效:
上面我们模订定单提交的例子,在提交一个订单前,我们需要做很多的筹备事情,,好比数据有效性校验等;订单提交完成之后,我们还需要做日志记录等。上面的代码很简单,没有任何庞大的逻辑,从上面的代码可以看出,我们通过静态植入的方法手动在执行要领前和执行要领后让它做一些我们需要的成果。AOP的实现道理应该也是如此,只不过它辅佐我们做了要领拦截,帮我们省去了大量反复代码,我们要做的仅仅是写好拦截前和拦截后需要措置惩罚惩罚的逻辑。
2、动态代办代理