AOP - AspectSharp 2.1.1.0

AspectSharp项目地址:AspectSharp - .NET AOP Framework
这个项目从05年开始已经没有维护了,估计现在已经没落,现在AOP用的比较多的应该是PostSharp,PostSharp使用上应该非常方便,但前段时间已经商业化运作了,仍提供社区版,但功能上有一些限制

AspectSharp现在网上较完整的例子比较少,从sourceforge下载项目源代码,里面有一个example项目,可以使用这个项目大致看一下AspectSharp的使用方式
因为下载的example项目运行时会出错,而AspectSharp使用的还是Castle.DynamicProxy.dll文件,我将AspectSharp做了点修改
1. 改成.Net Framework 3.5版本,因为新的Castle DynamicProxy使用的是3.5版本了
2. 改成使用Castle.DynamicProxy2.dll。主要是老的DynamicProxy中不少创建代理的方法、代理的使用方法都发生变化了,老的AspectSharp代码无法工作
修改之后,这篇文章中的例子以及AspectSharp中的Example项目都能正常运行,从这里下载附件可以运行这篇文章中的示例程序。但是因为新的DynamicProxy中拦截器接口机制的改变,无法确保我对AspectSharp的修改一定是正确的,因此这个下载仅用于演示目的

codeproject上面有篇.NET下开源AOP框架的对比文章:Rating of Open Source AOP Frameworks in .Net。AspectSharp在里面的评价很低,最好的是PostSharp,其次是Unity跟Spring.NET

引用命名空间:

using AopAlliance.Intercept;

using AspectSharp.Builder;

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//测试用的目标类

public class RequestProcessor

{

    //需要是virtual的方法才能拦截

    public virtual void Process()

    {

        Console.WriteLine("Hello AspectSharp");

    }

}

//记录日志用的拦截器

public class LoggerInterceptor : IMethodInterceptor

{

    public object Invoke(IMethodInvocation invocation)

    {

        Console.WriteLine("Before {0} on {1}", invocation.Method.Name, invocation.Method.DeclaringType);

        object returnVal = invocation.Proceed();

        Console.WriteLine("After {0} on {1}", invocation.Method.Name, invocation.Method.DeclaringType);

        return returnVal;

    }

}

测试代码如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

static void Main(string[] args)

{

    StandardCall();

    AopCall();

    Console.ReadKey();

}

//正常的调用,不使用AOP拦截

private static void StandardCall()

{

    RequestProcessor rp = new RequestProcessor();

    rp.Process();

    Console.WriteLine();

}

//使用AOP拦截后的调用

private static void AopCall()

{

    //AOP的拦截配置,这些配置可以放入配置文件中

    //import: 导入命名空间,比如拦截器所在的命名空间

    //aspect: 定义一个拦截的aspect, for指令用于指示需要拦截的类所在的命名空间

    //pointcut: 定义一个拦截点,使用method指定需要拦截的方法,还可以使用property指定需要拦截的属性,

    //    或者使用propertyread、propertywrite等用于拦截属性的getter、setter操作,

    //    被拦截的方法需要是virtual类型的,否则无法实现拦截(跟Castle Dynamic Proxy机制相关)

    //advice: 定义拦截器

    string config = @"

import AspectSharp.Test

aspect processor for [AspectSharp.Test] 

    pointcut method(* Process())

        advice(LoggerInterceptor)

    end

end";

    AspectLanguageEngineBuilder engineBuilder = new AspectLanguageEngineBuilder(config);

    AspectEngine engine = engineBuilder.Build();

    //使用AspectSharp包装,AspectSharp将根据配置生成代理对象,在代理对象上使用拦截器实现AOP拦截处理

    RequestProcessor rp = engine.WrapClass(typeof(RequestProcessor)) as RequestProcessor;

    rp.Process();

    Console.WriteLine();

}

运行结果如下:
    

从上面可以看到,感觉AspectSharp AOP唯一有点新意的地方就是使用了antlr来定义AOP的配置语言,其实使用动态代理,或者Post Compilation的方式自己实现一下拦截也是比较容易的事情。AspectSharp中使用AOP的地方也还得采取措施对AspectEngine进行包装,整体来看这个AOP对代码不是完全透明的上面只是简单演示了一下AspectSharp的基本用法,因为使用了Castle.DynamicProxy实现AOP,因此AspectSharp也支持mixins等

时间: 2024-11-05 19:33:37

AOP - AspectSharp 2.1.1.0的相关文章

Java入门到精通——调错篇之Spring2.5利用aspect实现AOP时报错: error at ::0 can't find referenced pointcut XXX

一.问题描述及原因. 利用Aspect注解实现AOP的时候出现了error at ::0 can't find referenced pointcut XXX.一看我以为注解写错了,结果通过查询相关资料是因为Spring2.5与中的aspectjweaver.jar 和aspectjrt.jar这两个jar包与JDK1.7不匹配. org.springframework.beans.factory.BeanCreationException: Error creating bean with n

AOP框架Dora.Interception 3.0 [3]: 拦截器设计

对于所有的AOP框架来说,多个拦截器最终会应用到某个方法上.这些拦截器按照指定的顺序构成一个管道,管道的另一端就是针对目标方法的调用.从设计角度来将,拦截器和中间件本质是一样的,那么我们可以按照类似的模式来设计拦截器. 一.InvocationContext 我们为整个拦截器管道定义了一个统一的执行上下文,并将其命名为InvocationContext.如下面的代码片段所示,我们可以利用InvocationContext对象得到方法调用上下文的相关信息,其中包括两个方法(定义在接口和实现类型),

AOP框架Dora.Interception 3.0 [4]: 基于特性的拦截器注册

按照单一职责的原则,拦截器只负责需要的拦截操作的执行,至于它采用何种方式应用到目标方法上,以及它在整个拦截器管道中的位置则属于“拦截器注册”的范畴.Dora.Interception提供了几种典型的注册方法,用户也可以根据自己的需求实现自己的注册方式. 一.IInterceptorProvider 一般来说,每一个拦截器类型都对应着一个IInterceptorProvider实现类型,后者利用其Use方法负责将前者放置到拦截器管道指定的位置.如下面的代码所示,IInterceptorProvid

引入AOP 报错 error at ::0 formal unbound in pointcut

使用了AOP 后启动报错 九月 27, 2016 2:29:46 下午 org.springframework.context.support.AbstractApplicationContext refresh 警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException:

Spring: aop自动标注时出现 “0 formal unbound in pointcut"

异常代码信息: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService' defined in class path resource [cn/czk/test06/bean.xml]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentExceptio

Spring注解驱动开发-AOP、Tx和Servlet3.0

1 AOP 1.1 什么是AOP? 在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式. 底层就是动态代理. 1.2 AOP的应用 步骤: ①定义一个目标类以及目标方法. ②定义一个切面类,以及前置通知.后置通知等,使用各自的注解将通知织入到目标方法上. ③将目标类和切面类注册到容器中. ④在切面类上标注@Aspect注解,来告诉Spring这是一个切面类. ⑤在配置类上加上@EnableAspectJAutoProxy开启AspectJ自动代理. 示例: MathCalcu

AOP框架Dora.Interception 3.0 [1]: 编程体验

.NET Core正式发布之后,我为.NET Core度身定制的AOP框架Dora.Interception也升级到3.0.这个版本除了升级底层类库(.NET Standard 2.1)之外,我还对它进行大范围的重构甚至重新设计.这次重构大部分是在做减法,其目的在于使设计和使用更加简单和灵活,接下来我们就来体验一下在一个ASP.NET Core应用程序下如何使用Dora.Interception. 源代码下载实例1(Console)实例2(ASP.NET Core MVC + 注册可拦截服务)实

Spring AOP(面向切面示例)

什么是AOP?基本概念切面(aspect):横切关注点被模块化的特殊对象.通知(advice):切面必须要完成的工作.切面中的每个方向称之为通知.通知是在切面对象中的.目标(target):被通知的对象.代理(proxy):向目标对象应用通知后创建的对象. 连接点(joinpoint):目标对象的程序执行的某个特定位置.如某个方法调用前,调用后的位置.包括两个信息:1.目标程序的哪个方法?2.方法执行 前还是执行后?切点(pointcut):每个类会有多个连接点,AOP通过切点定位到特定的边接点

JavaEE学习之Spring aop

一.基本概念 AOP——Aspect-Oriented Programming,面向切面编程,它是spring框架的一个重要组成部分.一般的业务逻辑都有先后关系,我们可以理解为纵向关系,而AOP关注的是横向关系,每一个关注点可以理解为一个横切面.例如我们的大部分代码都会涉及到日志记录,很多的数据库操作都会涉及到事务的创建和提交.那么从横向关注这些逻辑,他们都一个个的切面. AOP技术的具体实现,可以通过动态代理技术或者是在程序编译期间进行静态的"织入"方式.AOP经常使用的场景包括:日