基于.NET Framework实现可容错AOP框架
- 格式:pdf
- 大小:238.30 KB
- 文档页数:4
基于 MVC的热插拔模块式开发框架(OrchardNoCMS)--AOP编程AOP编程在目前来说好像是大家都比较喜欢的。
MVC中的Filter就是使用AOP实现的配置器模式。
AOP在编码中的应用主要有如下几个方面:日志记录,跟踪,优化和监控事务的处理持久化性能的优化资源池,如数据库连接池的管理系统统一的认证、权限管理等应用系统的异常捕捉及处理针对具体行业应用的横切行为前面几种应用我相信大家都是比较熟悉的。
在 MVC中有Filter之类的,提供认证和权限管理。
很多实现AOP的组件都是拿日志作为例子说明。
我这里给大家说明一个具体业务的横切例子。
以之前的Orchard.Car模块为例,如果我们这个模块式产品中的一个模块,当应用到项目中时,可能需要一些改动,那么AOP就可以在很多时候解决我们的问题。
假设我们现在有一个方法是获取Car的列表,那么对应的代码如下:对应的Service代码如下:别忘了在Route.cs中添加路由代码。
运行,查看结果:如果在产品发布后,项目A中使用该产品,需要为car添加一个字段,叫做缩略图,那么很现实的一个问题是,我们是不是为了项目A单独为car扩展一个字段?这时候适配器就很重要了,实现适配器的方式有很多,我们这里就说明下如何使用AOP来实现字段的扩展。
首先需要一个Aufofac的module类,代码如下:我们只需要为CarInfoService类来添加一个拦截器,别的就没有必要了。
这里你会看到有一个SimpleInterceptor类,它的作用就是用来对CarInfoService的方法进行拦截。
SimpleInterceptor的代码如下:如果当前的方法名称是GetList那么我们就为它添加一个字段,代表缩略图。
这里我随便写一个,你可以根据自己的实际需要去做相应的改变。
现实中,可能这个Interceptor是在一个扩展模块中,所以对应的需要一个扩展的服务来提供Thumb字段。
.NET平台常见技术框架整理汇总使⽤.NET平台开发有段时间了,在⽹上资料的基础上做了进⼀步整理,汇集了.NET平台常见的技术框架。
参考资料:1.知识⽹络2.分类清单名称说明地址Windows ServerAppFabric微软⾃家分布式缓存服务框架, 扩展了 Windows Server 为 Web 应⽤程序和中间层服务提供增强的托管、管理和缓存功能Memcahed⾼性能的分布式内存对象缓存系统。
它基于⼀个存储键/值对的hashmap,通过在内存中缓存数据和对象来减少读取数据库的次数,从⽽提⾼动态、数据库驱动⽹站的速度。
Redis使⽤ANSI C语⾔编写、⽀持⽹络、可基于内存亦可持久化的⽇志型、Key-Value数据库,并提供多种语⾔的APINCache基于NGINX的Web服务器构建起来的缓存系统,适⽤于需要快速部署、⼤并发量、⼤存储量的需求2.2.应⽤框架名称说明地址Boilerplate基于领域驱动的开源Web开发框架Orchard国外⼀个MVC开源的博客系统。
DasBlog国外⼀个基于的博客系统国外⼀款免费开源的博客系统。
⼀套⾮常优秀的基于的开源门户⽹站程序。
国内开源的论坛社区系统。
nopCommerce和Aspxcommerce国外⼀套⾼质量的开源B2C⽹站系统。
DTCMS国内两款开源的⽹站管理系统2.3.⽇志记录异常处理名称说明地址Log4Net轻量级的免费开源.NET⽇志记录框架。
Enterprise Library LogApplication Black微软企业库⽇志记录。
Elmah实现最流⾏的应⽤异常⽇志记录框架。
NLog简单灵活的⽇志记录类库,性能⽐Log4Net⾼,使⽤和维护难度低。
Essential Diagnostics为内置System.Diagnostics 命名空间扩展功能,提供更灵活的⽇志功能。
官⽹Logary mono 和 .Net 平台下⾼性能、多⽬标的⽇志、度量、追踪和健康检查库。
.Net学习之IOC,AOPDIP依赖倒置原则:系统架构时,高层模块不应该依赖于低层模块,二者通过抽象来依赖依赖抽象,而不是细节贯彻依赖倒置原则,左边能抽象,右边实例化的时候不能直接用抽象,所以需要借助一个第三方高层本来是依赖低层,但是可以通过工厂(容器)来决定细节,去掉了对低层的依赖IOC控制反转:把高层对低层的依赖,转移到第三方决定,避免高层对低层的直接依赖(是一种目的)那么程序架构就具备良好扩展性和稳定性DI依赖注入:是用来实现IOC的一种手段,在构造对象时,可以自动的去初始化,对象需要的对象构造函数注入属性注入方法注入,IOC容器初始化ApplePhone 的时候通过配置文件实例化属性,方法,构造函数using Microsoft.Practices.Unity;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Ruanmou.Interface;using System;using Unity.Attributes;namespace Ruanmou.Servicepublic class ApplePhone : IPhone{[Dependency]//属性注入:不错,但是有对容器的依赖public IMicrophone iMicrophone { get; set; }public IHeadphone iHeadphone { get; set; }public IPower iPower { get; set; }//[InjectionConstructor]public ApplePhone(){Console.WriteLine("{0}构造函数", this.GetType().Name);}//[InjectionConstructor]//构造函数注入:最好的,默认找参数最多的构造函数public ApplePhone(IHeadphone headphone){this.iHeadphone = headphone;Console.WriteLine("{0}带参数构造函数", this.GetType().Name);}public void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}[InjectionMethod]//方法注入:最不好的,增加一个没有意义的方法,破坏封装public void Init1234(IPower power)this.iPower = power;}}}不管是构造对象,还是注入对象,这里都是靠反射做到的有了依赖注入,才可能做到无限层级的依赖抽象,才能做到控制反转IOC Unity容器可以通过代码注册或配置文件注册接口对应实现类,实现了不依赖具体,可以对对象全局单例,线程单例例子1Service业务逻辑层升级,在原有1.0的基础上添加一些功能,使用配置文件注册<container name="testContainer1"><registertype="Ruanmou.Interface.IPhone,Ruanmou.Interface"mapTo="Ruanmou.Service.ApplePhone, Ruanmou.Service"/> <registertype="Ruanmou.Interface.IPhone,Ruanmou.Interface"mapTo="Ruanmou.Service.AndroidPhone, Ruanmou.Service" name="Android"/><register type="Ruanmou.Interface.IMicrophone, Ruanmou.Interface"mapTo="Ruanmou.Service.Microphone, Ruanmou.Service"/><register type="Ruanmou.Interface.IHeadphone, Ruanmou.Interface"mapTo="Ruanmou.Service.Headphone, Ruanmou.Service"/><register type="Ruanmou.Interface.IPower,Ruanmou.Interface"mapTo="Ruanmou.Service.Power, Ruanmou.Service"/><register type="Ruanmou.IDAL.IBaseDAL, Ruanmou.IDAL" mapTo="Ruamou.DAL.BaseDAL, Ruamou.DAL"/></container><container name="testContainer"><registertype="Ruanmou.Interface.IPhone,Ruanmou.Interface"mapTo="Ruanmou.Service.AndroidPhone,Ruanmou.Service.Extend"/><registertype="Ruanmou.Interface.IPhone,Ruanmou.Interface"mapTo="Ruanmou.Service.AndroidPhone,Ruanmou.Service.Extend" name="Android"/><register type="Ruanmou.Interface.IMicrophone, Ruanmou.Interface"mapTo="Ruanmou.Service.Microphone, Ruanmou.Service.Extend"/><register type="Ruanmou.Interface.IHeadphone, Ruanmou.Interface"mapTo="Ruanmou.Service.Headphone, Ruanmou.Service.Extend"/><register type="Ruanmou.Interface.IPower, Ruanmou.Interface"mapTo="Ruanmou.Service.Power, Ruanmou.Service.Extend"/><register type="Ruanmou.IDAL.IBaseDAL, Ruanmou.IDAL" mapTo="Ruamou.DAL.BaseDAL, Ruamou.DAL"/></container>只需要把服务2.0的类库(实现1.0的原有接口)dll拿过来即可使用,代码不做任何修改例子2 业务扩展,新加功能应该是加几个接口和实现类的映射,就可以解决了。
时间要追溯到2005年。
那时正在做硕士论文。
题目是“AOP framework for .net”。
这个AOP框架将使用C#2.0来实现。
这当然没什么令人惊奇的。
从理论上说,任何开发语言都可以实现AOP框架。
但要按着AOP联盟的规范实现这个AOP框架,大多数的开发语言并不能很容易地完成这项任务。
微软公司在我们心目中是强大的,而出自于微软的C#自然也会被认为是强大的。
使用C#几乎可以很容易地完成大多数的应用程序(包括桌面、Web、移动等)。
但要用C#来实现标准的AOP框架却不是那么容易,甚至有点强人所难。
这到底是为什么呢?一、AOP的概念和原理AOP(Aspect Oriented Programming)的中文意思是“面向方面编程”。
它是10年前由施乐公司提出的。
这种技术并不是一种新的编程技术,和OOP(Object Oriented Programming)并不是平级的。
它只是OOP的一种扩展。
一个典型的软件系统由核心功能和系统功能组成。
所谓核心功能就是和这个系统相关的业务功能,如在mail服务器中的核心功能是接收和发送电子邮件。
系统功能则可以看成是系统的可选功能,如日志、安全等。
如果没有了这些功能,mail服务器仍可以照常工作,只是不太安全了,并且无法查找以往的记录。
实现这些系统功能,一般的作法是将系统功能的代码和核心功能的代码混在一起。
这样做不仅加大了系统设计和实现的难度,而且使设计系统核心功能的程序员必须要考虑这些系统的功能,分散了他们的注意力。
由于在软件开发中遇到以上问题,人们开始设想是否能将软件中的核心功能和系统功能分开,达到单独设计、实现、维护的目的。
于是就有人提出在设计和实现时单独进行,当编译时将单独编写的系统功能的代码织入(weaves)到核心功能的代码中,将代码织入的工具叫织入器(weaver)。
这种思想经过长期的实践,就逐渐形成了AOP的核心思想,同时也形成了AOP最早的一个实现:AspectJ。
AOP在.NET中的应用,个人也属于学习阶段,欢迎大家拍砖!本文的例子模拟用户注册的场景,主要通过代码演示几种方案的实现方式。
静态代理通过代理模式实现静态代理,大家一看代码基本就明白了。
用户注册接口和实现public interface IUserProcessor{void RegUser(User user);}public class UserProcessor : IUserProcessor{public void RegUser(User user){Console.WriteLine("用户已注册。
Name:{0},PassWord:{1}", , u ser.PassWord);}}通过静态编写代码的方式,装饰上面的用户注册public class UserProcessorDecorator:IUserProcessor{public IUserProcessor UserProcessor { get; set; }public UserProcessorDecorator(IUserProcessor userprocessor){UserProcessor = userprocessor;}public void RegUser(User user){PreProceed(user);UserProcessor.RegUser(user);PostProceed(user);}public void PreProceed(User user){Console.WriteLine("方法执行前");}public void PostProceed(User user){Console.WriteLine("方法执行后");}}客户端调用public class Client{public static void Run(){try{User user = new User() { Name = "lee", PassWord = "123123123 123" };IUserProcessor userprocessor = new UserProcessorDecorator(ne w UserProcessor());userprocessor.RegUser(user);}{throw ex;}}}输出方法执行前用户已注册。
.NET AOP实现事务原理一、什么是A O PA O P(As pe ct-O ri en t ed Pr og ra mm in g)是一种编程范式,它通过在程序运行期间动态切入代码,将横切关注点与核心业务逻辑进行解耦。
在传统的面向对象编程中,横切关注点(如日志记录、事务管理等)会与核心业务逻辑相互交织,导致代码的可读性和可维护性下降。
而A OP的出现,使得我们可以通过在特定的切入点上执行切面代码,将横切关注点与核心业务逻辑分离开来,从而提高代码的模块化和可维护性。
二、A O P实现事务的优势在众多的横切关注点中,事务管理是一个非常常见且重要的功能。
事务管理用于保证数据库操作的一致性和可靠性,在数据操作中具有关键的作用。
使用A OP实现事务管理的主要优势有:降低代码耦合性1.:通过A OP,将事务管理与具体业务逻辑分离,减少代码中的重复性和冗余性,使得代码更具可读性和可维护性。
提高系统灵活性2.:通过A OP,可以灵活地配置事务的传播行为、隔离级别以及异常处理等,满足不同业务场景下对事务处理的需求。
简化事务处理3.:AO P框架提供了一些便捷的注解或配置方式,能够简化事务管理的操作,大大减少了编码的工作量。
三、.NET AO P实现事务原理在.NE T平台下,实现A OP的方式有很多,包括基于动态代理的方式、基于注解的方式以及基于配置文件的方式等。
本文将以基于动态代理的方式来讲解.N ET AO P实现事务的原理。
1.准备工作为了实现AO P事务功能,我们首先需要引入相关的N uG et包,包括:```m ar kd ow n<p ac ka ge s><p ac ka ge id="Un ity"ve rs io n="5.11.10"t ar ge tF ra me wor k="ne t 472"/><p ac ka ge id="Un ity.In t e rc ep ti on"ve r si on="5.11.10"t a rg et F r a me wo rk="ne t472"/></pa ck ag es>```2.定义切面我们需要定义一个切面类,该类需要继承自`I In te rc ep ti on Beh a vi or`接口,并实现其中的方法。
.Net常见的IOC框架及AOP框架IOC框架1. Unity:微软patterns&practicest团队开发的IOC依赖注⼊框架,⽀持AOP横切关注点。
2. MEF(Managed Extensibility Framework):是⼀个⽤来扩展.NET应⽤程序的框架,可开发插件系统。
3. :依赖注⼊、⾯向⽅⾯编程(AOP)、数据访问抽象,、以及集成。
4. Autofac:最流⾏的依赖注⼊和IOC框架,轻量且⾼性能,对项⽬代码⼏乎⽆任何侵⼊性。
5. Ninject:基于.NET轻量级开源的依赖注⼊IOC框架AOP框架1. Castle2. Encase 是C#编写开发的为.NET平台提供的AOP框架。
Encase 独特的提供了把⽅⾯(aspects)部署到运⾏时代码,⽽其它AOP框架依赖配置⽂件的⽅式。
这种部署⽅⾯(aspects)的⽅法帮助缺少经验的开发⼈员提⾼开发效率。
3. NKalore 是⼀款编程语⾔,它扩展了C#允许在.net平台使⽤AOP。
NKalore的语法简单、直观,它的编译器是基于Mono C#编译器(MCS)。
NKalore⽬前只能在命令⾏或#Develop内部使⽤。
NKalore兼容公共语⾔规范CLS(Common Language Specification),它可以在任何.NET开发环境中使⽤,包括微软的Visual Studio .NET。
4. PostSharp 读取.NET字节模块,转换成对象模型。
让插件分析和转换这个模型并写回到MSIL。
PostSharp使开发程序分析应⽤程序容易得像分析代码规则和设计模式,它使程序开发的思想变⾰为⾯向⽅⾯软件开发(AOSD/AOD)思想。
5. AspectDNG 的⽬标是为.NET开发⼈员提供简单⽽功能强⼤的AOP-GAOP实现。
它效仿Java下的开源⼯具AspectJ 和 Spoon,成熟程度也很接近它们。
6. RAIL(Runtime Assembly Instrumentation Library) 开源项⽬可以在C#程序集加载和运⾏前进⾏处理控制调整和重新构建。
aop 实现原理AOP(Aspect-Oriented Programming)是一种编程范式,通过将横切关注点(cross-cutting concerns)从核心业务逻辑中解耦,实现了代码的模块化和可维护性的提升。
本文将从AOP的基本概念、实现原理、应用场景等方面进行介绍。
一、AOP的基本概念AOP是一种面向切面的编程思想,它主要关注于在软件开发过程中经常出现的一些与业务逻辑无关,但是又必须在业务逻辑中进行处理的横切关注点,如日志记录、性能监控、事务管理等。
在传统的面向对象编程中,这些横切关注点常常会与核心业务逻辑混杂在一起,导致代码的复杂性和维护难度的增加。
二、AOP的实现原理AOP的实现原理主要是通过动态代理技术和字节码操作技术来实现的。
在运行时,AOP框架会根据开发人员定义的切面(Aspect)信息,动态生成代理对象,将切面逻辑织入到原有的代码中。
具体来说,AOP框架会根据切面定义的切点(Pointcut)信息,找到需要被拦截的目标方法,在目标方法执行前后插入切面逻辑。
三、AOP的应用场景1.日志记录:通过AOP可以将日志记录的逻辑与核心业务逻辑分离,提高日志记录的可维护性和扩展性。
2.性能监控:AOP可以实现对方法的执行时间进行监控,帮助开发人员找出程序的性能瓶颈,从而进行优化。
3.事务管理:通过AOP可以实现对事务的自动管理,避免手动编写事务管理代码,提高代码的可读性和可维护性。
4.权限控制:AOP可以实现对方法的访问权限进行控制,保证系统的安全性。
5.异常处理:AOP可以实现对方法的异常进行捕获和处理,提高系统的健壮性和容错性。
四、AOP的实现方式1.基于动态代理的实现方式:通过Java的动态代理机制,在运行时动态生成代理对象,并将切面逻辑织入到原有的代码中。
常见的动态代理技术有JDK动态代理和CGLIB动态代理。
2.基于字节码操作的实现方式:通过字节码操作技术,如ASM、Javassist等,直接修改字节码文件,将切面逻辑织入到原有的代码中。