Unity是微软P&P部门开发的一个轻量级IoC框架,通过Interception机制可以实现基于三种拦截机制的AOP。 1: IUnityContainer container = new UnityContainer(); 2: container.AddNewExtension<Interception>() new UnityContainer(); 2: container.AddNewExtension<AutoInterception>() 3: .AddNewExtension<Interception new UnityContainer(); 2: container.AddNewExtension<AutoInterception>() 3: .AddNewExtension<Interception "/> 16: <register type="IFoo" mapTo="Foo"/> 17: <interception> 18: <policy
.NET Core正式发布之后,我为.NET Core度身定制的AOP框架Dora.Interception也升级到3.0。 三、依赖注入 Dora.Interception是为.NET Core度身定制的轻量级AOP框架。 由于依赖注入已经成为了.NET Core基本的编程方式,所以Dora.Interception和.NET Core的依赖注入框架进行了无缝整合。 Dora.Interception刻意将“拦截器”和“拦截器注册”分离开来,因为拦截器具有不同的注册方式。 比如我们在根目录下创建一个interception.dora文件,并在其中定义如下的策略。
多年之前利用IL Emit写了一个名为Dora.Interception(github地址,觉得不错不妨给一颗星)的AOP框架。 、在ASP.NET Core程序中的应用 一、Dora.Interception的设计特点 彻底改造升级后的Dora.Interception直接根据.NET 6开发,不再支持之前.NET (Core) 除了性能的提升和保持低侵入性,Dora.Interception在编程方式上于其他所有的AOP框架都不太相同。 接下来我们通过一个简单实例来演示一下Dora.Interception如何使用。 Dora.Interception直接利用依赖注入容器来提供可被拦截的实例。
Dora.Interception采用IL Eimit的方式实现对方法调用的拦截,接下来我们就来聊聊大致的实现原理。 一、与依赖注入框架的无缝集成 由于Dora.Interception是为.NET Core定制的AOP框架,而依赖注入是.NET Core基本的编程方式,所以Dora.Interception最初就是作为一个依赖注入框架的扩展而涉及的 由于Dora.Interception最终会利用IL Emit的方式动态生成目标实例的类型,所以它只适合第一种服务注册方式。 3.0 [1]: 编程体验 AOP框架Dora.Interception 3.0 [2]: 实现原理 AOP框架Dora.Interception 3.0 [3]: 拦截器设计 AOP框架Dora.Interception 3.0 [4]: 基于特性的拦截器注册 AOP框架Dora.Interception 3.0 [5]: 基于策略的拦截器注册 AOP框架Dora.Interception 3.0 [6]: 自定义拦截器注册方式
Dora.Interception直接根据.NET 6开发,不再支持之前.NET (Core)版本。 接下来我们通过一个简单实例来演示一下Dora.Interception如何使用。 Dora.Interception直接利用依赖注入容器来提供可被拦截的实例。 全新升级的AOP框架Dora.Interception[1]: 编程体验 全新升级的AOP框架Dora.Interception[2]: 基于约定的拦截器定义方式 全新升级的AOP框架Dora.Interception [3]: 基于“特性标注”的拦截器注册方式 全新升级的AOP框架Dora.Interception[4]: 基于“Lambda表达式”的拦截器注册方式 全新升级的AOP框架Dora.Interception
public delegate InterceptDelegate InterceptorDelegate(InterceptDelegate next); 三、基于约定的拦截器定义 Dora.Interception Dora.Interception同样支持基于约定的拦截器类型定义。 AOP框架Dora.Interception 3.0 [1]: 编程体验 AOP框架Dora.Interception 3.0 [2]: 实现原理 AOP框架Dora.Interception 3.0 [3]: 拦截器设计 AOP框架Dora.Interception 3.0 [4]: 基于特性的拦截器注册 AOP框架Dora.Interception 3.0 [5]: 基于策略的拦截器注册 AOP框架 Dora.Interception 3.0 [6]: 自定义拦截器注册方式
Dora.Interception只提供两种严谨的拦截器注册方式,一种前面介绍的针对特性标注的方式,另一种就是本篇介绍的针对策略的方式。 [Flags] public enum PropertyMethod { Get = 1, Set = 2, Both = 3 } 五、一个完整的拦截策略 通过上面Dora.Interception PropertyMethod.Get) .IncludeProperty(foobar => foobar.Set, PropertyMethod.Set))); AOP框架Dora.Interception 3.0 [1]: 编程体验 AOP框架Dora.Interception 3.0 [2]: 实现原理 AOP框架Dora.Interception 3.0 [3]: 拦截器设计 AOP框架Dora.Interception 3.0 [4]: 基于特性的拦截器注册 AOP框架Dora.Interception 3.0 [5]: 基于策略的拦截器注册 AOP框架Dora.Interception 3.0 [6]: 自定义拦截器注册方式
Dora.Interception提供了几种典型的注册方法,用户也可以根据自己的需求实现自己的注册方式。 如果该属性返回False,Dora.Interception只会选择其中一个。
Dora.Interception只提供两种严谨的拦截器注册方式,一种前面介绍的针对特性标注的方式,另一种就是本篇介绍的针对策略的方式。 InterceptionBuilder builder, Action<IInterceptionPolicyBuilder> configure); } 二、IInterceptionPolicyBuilder Dora.Interception [Flags] public enum PropertyMethod { Get = 1, Set = 2, Both = 3 } 五、一个完整的拦截策略 通过上面Dora.Interception
本系列前面的五篇文章主要介绍Dora.Interception(github地址,觉得不错不妨给一颗星)的编程模式以及对它的扩展定制,现在我们来聊聊它的设计和实现原理。 实际上.NET的编译平台Roslyn本就可以将C#代码编程成对应的程序集,所以Dora.Interception直接利用了这个能力。 _returnValue = val); } } 全新升级的AOP框架Dora.Interception[1]: 编程体验 全新升级的AOP框架Dora.Interception[2]: 基于约定的拦截器定义方式 全新升级的AOP框架Dora.Interception[3]: 基于“特性标注”的拦截器注册方式 全新升级的AOP框架Dora.Interception[4]: 基于“Lambda表达式”的拦截器注册方式 全新升级的AOP框架Dora.Interception[5]: 实现任意的拦截器注册方式 全新升级的AOP框架Dora.Interception[6]: 框架设计和实现原理
Dora.Interception 1.0(Github地址:可以访问GitHub地址:https://github.com/jiangjinnan/Dora)推出有一段时间了,最近花了点时间将它升级到 一、对基于Task的并行编程的支持 由于Dora.Interception将Dora.DynamicProxy作为默认的动态代理类型生成框架,所以不在依赖任何第三发框架,因此在编程会变得更加简单,现在我们来做一个简单的演示 在安装了最新版本的NuGet包Dora.Interception之后,我们可以按照 “约定” 的方式来定义如下这么一个简单的Interceptor类型。 } public async Task InvokeAsync(InvocationContext context) { Console.WriteLine("Interception task starts."); await Task.Delay(1000); Console.WriteLine("Interception task completes
为此,我自己写了一个AOP框架,该框架被命名为Dora.Interception。 二、Dora.Interception的设计目标 三、以怎样的方式使用Dora.Interception 四、如何定义一个Interceptor 五、定义InterceptorAttribute 六、应用 二、Dora.Interception的设计目标 我当初在设计Dora.Interception框架时给自己确定的几个目标: Dora.Interception一个基于运行时(Run Time),而不是针对编译时 三、以怎样的方式使用Dora.Interception Dora.Interception目前的版本为1.1.0,由如下两个NuGet包来承载,由于Dora.Interception.Castle依赖于 Dora.Interception,所以安装后者即可。
为了演示Interception的使用,我们创建一个简单的例子。 对Unity和PIAB两者之间的集成,需要我们借助Interception为每一个需要被劫持(Interception)的类型注册相应的Interceptor(实现接口Microsoft.Practices.Unity.InterceptionExtension.IInterceptor 为此,我对Interception进行了扩展,实现了Interceptor的动态注册。 ("interception"); } this.Interception = interception; } private ("interception"); } this.Interception = interception; } private
在《不一样的Interceptor》中我们着重介绍了Dora.Interception中最为核心的对象Interceptor,以及定义Interceptor类型的一些约定。 Dora.Interception对此作了相应的处理,确保只有更接近目标方法上的特性采用有效的。 的时候参考了很多主流的AOP框架,而我是Unity多年深度使用者,曾经多次研究过Unity.Interception的源代码。 我觉得很多的AOP框架都过于复杂,刻意地添加了一些我觉得不它适合的特性,所以我的Dora.Interception在很多方面实际上在做减法。 所以我们在发布Dora.Interception的时候将这种注册方式移除了,所以目前为止只支持特性标注这一种注册方式。
Dora.Interception(github地址,觉得不错不妨给一颗星)有别于其他AOP框架的最大的一个特点就是采用针对“约定”的拦截器定义方式。 如果在ASP.NET Core应用中,这个属性将返回针对当前请求的IServiceProvider,否则Dora.Interception会为每次方法调用创建一个服务范围,并返回该范围内的IServiceProvider 全新升级的AOP框架Dora.Interception[1]: 编程体验 全新升级的AOP框架Dora.Interception[2]: 基于约定的拦截器定义方式 全新升级的AOP框架Dora.Interception [3]: 基于“特性标注”的拦截器注册方式 全新升级的AOP框架Dora.Interception[4]: 基于“Lambda表达式”的拦截器注册方式 全新升级的AOP框架Dora.Interception [5]: 实现任意的拦截器注册方式 全新升级的AOP框架Dora.Interception[6]: 框架设计和实现原理
UnityContainer = new UnityContainer(); UnityContainer.AddNewExtension<Interception>() .RegisterType<IFooService, FooService>() /// FooService的AOP .Configure<Interception InterfaceInterceptor()); /// BarSerice的AOP UnityContainer.AddNewExtension<Interception >() .RegisterType<IBarService, BarSerice>() .Configure<Interception>( >() .RegisterType<IBarService, BarSerice>() .Configure<Interception>() .SetInterceptorFor<IBarService
Interception这个名次并不是和AOP的概念一同产生的。 顾名思义,Interception就是拦截。 本系列的第一篇文章使用java1.3提供的动态代理功能实现了一个Interception的例子,演示了在某个方法执行前和执行后进行了拦截(Interception)。 注意AOP中的Interception和普通概念的interception是不同的。我们最后再讨论这个问题。 当然如果你通过设计模式,配置文件等可以让Interception动态指定的话,那你也基本作了一个AOP 的Interception 。 这就是Nanning已经作的工作。
在Dora.Interception(github地址,觉得不错不妨给一颗星)中按照约定方式定义的拦截器可以采用多种方式注册到目标方法上。 public virtual void Invoke2() => Console.WriteLine("Invoker.Invoke2()"); } 四、合法性检验 只有接口方法和虚方法才能被拦截,Dora.Interception P { get; set; } } 全新升级的AOP框架Dora.Interception[1]: 编程体验 全新升级的AOP框架Dora.Interception[2]: 基于约定的拦截器定义方式 全新升级的 AOP框架Dora.Interception[3]: 基于“特性标注”的拦截器注册方式 全新升级的AOP框架Dora.Interception[4]: 基于“Lambda表达式”的拦截器注册方式 全新升级的 AOP框架Dora.Interception[5]: 实现任意的拦截器注册方式 全新升级的AOP框架Dora.Interception[6]: 框架设计和实现原理
为了帮助大家更深刻地认识Dora.Interception,并更好地将它应用到你的项目中,我们通过如下几个简单的实例来演示几个常见的AOP应用在Dora.Interception下的实现。 this.ParameterInfo = parameterInfo; 14 this.Value = valule; 15 } 16 } 就像Dora.Interception
上一篇《更加简练的编程体验》提供了最新版本的Dora.Interception代码的AOP编程体验,接下来我们会这AOP框架的编程模式进行详细介绍,本篇文章着重关注的是拦截器的定义。 采用“基于约定”的Interceptor定义方式是Dora.Interception区别于其他AOP框架的一个显著特征,要了解拦截器的编程约定,就得先来了解一下Dora.Interception中针对方法调用的拦截是如何实现的 一、针对实例的拦截 总地来说,Dora.Interception针对方法调用的拦截机制分为两种类型,我将它称为“针对实例的拦截”和“针对类型”的拦截。 三、从两个Delegate说起 要理解Dora.Interception的设计,先得从如下这两个特殊的Delegate类型(InterceptDelegate和InterceptorDelegate)说起 如果类型实现某个接口,意味着必需按照规定的声明实现其方法,针对方法的服务注入将无法实现,所以Dora.Interception采用“基于约定”的方式来定义Interceptor类型。