关于Interception框架

对于OOP来说,是个树形结构,如果要实现多个子数之间的共享服务,例如很多子树都用到日志服务,这时候AOP的横切关注 cross cutting concerns就非常有用了。如果要使每个类具备一项功能,势必要修改每个需要的类结构,这样显然麻烦,而且不容易维护。AOP避免了这一点,将横切关注封装到了一个独立的单元,这样既使每个类都具备这项功能,又不破坏类的结构。Aspect,也就是一个方面,是一组可重用的代码片段,可以用来注入到已经存在的类里,而不改变类的代码。一般来说,aspect的代码会被框架处理一次,再进行代码注入code injection。注意,这里代码注入和依赖注入dependency injection是不一样的,

所谓代码注入,例如一个类需要日志服务,会在这个类需要调用日志的地方插入aspect的公共调用代码。有的AOP框架,例如PostSharp,会定义attribute,然后给需要的类的某个方法加上这个attribute,这样postsharp会把attribute里的部分代码插入到这个类的方法里。

实现AOP需要以下几个方面:

1.JoinPoints,连接点。需要某个aspect的target class的代码点,可以是方法等。可以在joinPoints的前,后,或者周围插入。

2.Pointcuts,切点。对JoinPoints的一次封装。

3.Advice or Introductions。是要插入到target class的aspect 代码段

4.Weaver。 编译器,用来执行代码注入的工具。

Unity Container应用了一个aop的feature,即interception mechanism,应用这个可以让代码有那么一点aop的意思。unity里的拦截器机制将会在指定方法的某个执行阶段,进行拦截,然后进行配置和重写目标行为。简单来说,拦截器机制就是给对象增加了行为,普通给对象加行为的方法是派生接口,但拦截机器不用修改对象的代码。Unity的interception是对decorator模式的一种实现,这种模式用来在运行时扩展对象的功能。

Unity的拦截器非常类似于一个pipeline,经过重重行为的附加filter,最终到达target class。从概念上说,分成三类,interceptor(proxy),behaviour pipeline,the behaviour(aspect)。interceptor是 拦截机制对外暴露的接口,当需要使用拦截机制时,需要使用interceptor,它检查所有已经注册的行为behaviour,把传给它的数据传给behaviour,并通过behaviour pipeline来执行这些行为。 Unity提供了两种interceptor,分别是instance interceptor 和 type interceptor,对应处理对象和类型的拦截。

时间: 2024-10-03 22:55:40

关于Interception框架的相关文章

NET Core度身定制的AOP框架

NET Core度身定制的AOP框架 多年从事框架设计开发使我有了一种强迫症,那就是见不得一个应用里频繁地出现重复的代码.之前经常Review别人的代码,一看到这样的程序,我就会想如何将这些重复的代码写在一个地方,然后采用"注入"的方式将它们放到需要的程序中.我们知道AOP是解决这类问题最理想的方案.为此,我自己写了一个AOP框架,该框架被命名为Dora.Interception.Dora.Interception已经在GitHub上开源,如果有兴趣的朋友想下载源代码或者阅读相关文档,

[.NET领域驱动设计实战系列]专题九:DDD案例:网上书店AOP和站点地图的实现

一.引言 在前面一专题介绍到,要让缓存生效还需要实现对AOP(面向切面编程)的支持.所以本专题将介绍了网上书店案例中AOP的实现.关于AOP的概念,大家可以参考文章:http://www.cnblogs.com/jin-yuan/p/3811077.html.这里我简单介绍下AOP:AOP可以理解为对方法进行截获,这样就可以在方法调用前或调用后插入需要的逻辑.例如可以在方法调用前,加入缓存查找逻辑等.这里缓存查找逻辑就在方法调用前被执行.通过对AOP的支持,每个方法就可以分为3部分了,方法调用前

Dora.Interception, 为.NET Core度身打造的AOP框架[4]:演示几个典型应用

为了帮助大家更深刻地认识Dora.Interception,并更好地将它应用到你的项目中,我们通过如下几个简单的实例来演示几个常见的AOP应用在Dora.Interception下的实现.对于下面演示的实例,它们仅仅是具有指导性质的应用,所以我会尽可能地简化,如果大家需要将相应的应用场景移植到具体的项目开发中,需要做更多的优化.源代码从这里下载. 目录一.对输入参数的格式化二.对参数的自动化验证三.对方法的返回值进行自动缓存 一.对输入参数的格式化 我们有一些方法对输入参数在格式上由一些要求,但

Dora.Interception,为.NET Core度身打造的AOP框架 [2]:以约定的方式定义拦截器

上一篇<更加简练的编程体验>提供了最新版本的Dora.Interception代码的AOP编程体验,接下来我们会这AOP框架的编程模式进行详细介绍,本篇文章着重关注的是拦截器的定义.采用“基于约定”的Interceptor定义方式是Dora.Interception区别于其他AOP框架的一个显著特征,要了解拦截器的编程约定,就得先来了解一下Dora.Interception中针对方法调用的拦截是如何实现的. 一.针对实例的拦截 总地来说,Dora.Interception针对方法调用的拦截机制

Dora.Interception,为.NET Core度身打造的AOP框架 [4]:与依赖注入框架的无缝集成

Dora.Interception最初的定位就是专门针对.NET Core的AOP框架,所以在整个迭代过程中我大部分是在做减法.对于.NET Core程序开发来说,依赖注入已经成为无处不在并且“深入骨髓”的东西,不论是在进行业务应用的开发,还是进行基础组件的开发,依赖注入是实现“松耦合”最为理想的方式(没有之一).对于绝大部分AOP框架来说,它们最终都会体现为创建一个能够拦截的“代理对象”来实现对方法调用的拦截,但是.NET Core中针对服务实例的提供完全由通过IServiceProvider

Dora.Interception,为.NET Core度身打造的AOP框架 [1]:更加简练的编程体验

很久之前开发了一个名为Dora.Interception的开源AOP框架(github地址:https://github.com/jiangjinnan/Dora,如果你觉得这个这框架还有那么一点价值,请不吝多点一颗星),最近对它作了一些改进(包括编程模式和性能,目前最新版本2.1.4).一直以来我对软件设计秉承的一个理念就是:好的设计应该是简单的设计.和其他AOP框架相比,虽然Dora.Interception提供的编程模式已经显得足够简单,但是我觉得还应该再简单点,再简单点.这个新版本对拦截

Dora.Interception,为.NET Core度身打造的AOP框架 [5]:轻松地实现与其他AOP框架的整合

这里所谓的与第三方AOP框架的整合不是说改变Dora.Interception现有的编程,而是恰好相反,即在不改变现有编程模式下采用第三方AOP框架或者自行实现的拦截机制.虽然我们默认提供基于IL Emit实现方式,并且对IL指令进行了深度的优化,但是如果我们真的具有更好的选择,我们可以通过简单的扩展完成对底层拦截机制改变. 一.IInterceptingProxyFactory 对于Dora.Interception来说,方法调用之所有能够被拦截的根源在于我们改变了服务实例的提供方式,原来的对

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 + 注册可拦截服务)实

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

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