Dora.Interception,为.NET Core度身打造的AOP框架 [5]:轻松地实现与其他AOP框架的整合
这里所谓的与第三方AOP框架的整合不是说改变Dora.Interception现有的编程,而是恰好相反,即在不改变现有编程模式下采用第三方AOP框架或者自行实现的拦截机制。虽然我们默认提供基于IL Emit实现方式,并且对IL指令进行了深度的优化,但是如果我们真的具有更好的选择,我们可以通过简单的扩展完成对底层拦截机制改变。
一、IInterceptingProxyFactory
对于Dora.Interception来说,方法调用之所有能够被拦截的根源在于我们改变了服务实例的提供方式,原来的对象被替换成了可被拦截的代理对象。针对代理对象的提供体现在如下这个IInterceptingProxyFactory接口上。如果提供类型体现为一个接口,Wrap方法会被调用来创建一个封装目标对象的代理(如果不需要被拦截,则直接返回目标对象);如果提供类型体现为一个类型,Create方法则被用来实现对代理对象的创建,如果不需要被拦截,方法提供的后面两个参数会被用来提供目标对象。
public interface IInterceptingProxyFactory
{
IServiceProvider ServiceProvider { get; } object Wrap(Type typeToIntercept, object target);
object Create(Type typeToIntercept, IServiceProvider serviceProvider, Func<object> targetAccessor = null);
}
二、InterceptingProxyFactoryBase
Dora.Interception提供了如下一个实现了IInterceptingProxyFactory接口的基类InterceptingProxyFactoryBase。后者帮助我们实现针对拦截器的解析,解析后的拦截器体现为一个InterceptorDecoration对象。作为它的派生类型只需要实现两个受保护的虚方法Wrap和Create根据解析出来的拦截器实现可被拦截的代理对象的创建。
public abstract class InterceptingProxyFactoryBase : IInterceptingProxyFactory
{
public IInterceptorResolver InterceptorResolver { get; }
public IServiceProvider ServiceProvider { get; }
public InterceptingProxyFactoryBase(IInterceptorResolver interceptorResolver, IServiceProvider serviceProvider); public object Create(Type typeToIntercept, IServiceProvider serviceProvider, Func<object> targetAccessor = null);
public object Wrap(Type typeToIntercept, object target); protected virtual bool CanIntercept(Type typeToIntercept);
protected abstract object Wrap(Type typeToIntercept, object target, InterceptorDecoration interceptors);
protected abstract object Create(Type typeToIntercept, IServiceProvider serviceProvider, InterceptorDecoration interceptors);
}
如果所示的是InterceptorDecoration, 我们可以得到应用到目标类型中所有方法(包括属性的Get和Set方法)上的拦截器(实际上所有拦截器按照指定顺序构建而成的拦截器管道,最终体现为一个类型为InterceptorDelegate 的委托对象)。
public sealed class InterceptorDecoration
{
public InterceptorDelegate GetInterceptor(MethodInfo methodInfo);
public MethodInfo GetTargetMethod(MethodInfo methodInfo);
public bool IsInterceptable(MethodInfo methodInfo); public IReadOnlyDictionary<int, InterceptorDelegate> Interceptors { get; }
public bool IsEmpty { get; }
public IReadOnlyDictionary<MethodInfo, MethodBasedInterceptorDecoration> MethodBasedInterceptors { get; }
public IReadOnlyDictionary<PropertyInfo, PropertyBasedInterceptorDecoration> PropertyBasedInterceptors { get; }
} public class MethodBasedInterceptorDecoration
{
public InterceptorDelegate Interceptor { get; }
public MethodInfo Method { get; }
} public class PropertyBasedInterceptorDecoration
{
public PropertyInfo Property { get; }
public MethodBasedInterceptorDecoration GetMethodBasedInterceptor { get; }
public MethodBasedInterceptorDecoration SetMethodBasedInterceptor { get; }
}
自定义的IInterceptingProxyFactory实现只需要按照普通的服进行注册即可。
三、针对Castle的集成
由于Castle原生的框架并没有提供针对Task的支持,所以我们利用另一个名为Castle.Core.AsyncInterceptor将Castle的拦截实现整合到Dora.Interception。具体的实现体现在如下这个DynamicProxyFactory中。该类型对应的NuGet包为“Dora.Interception.Castle”。
public class DynamicProxyFactory : InterceptingProxyFactoryBase
{
public DynamicProxyFactory(IInterceptorResolver interceptorResolver, IServiceProvider serviceProvider);
protected override object Create(Type typeToIntercept, IServiceProvider serviceProvider, InterceptorDecoration interceptors);
protected override object Wrap(Type typeToIntercept, object target, InterceptorDecoration interceptors);
}
如果需要采用基于Caslte的拦截实现机制,我们只需要做如下的设置即可。
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services
...
AddInterception(builder=>builder.SetCastleDynamicProxy());
}
...
}
或者
public class Startup
{
public IServiceProvider ConfigureServices(IServiceCollection services)
{
return services
...
.BuildInterceptableServiceProvider(builder=>builder.SetCastleDynamicProxy());
}
...
}
[1]:更加简练的编程体验
[2]:基于约定的拦截器定义方式
[3]:多样性的拦截器应用方式
[4]:与依赖注入框架的深度整合
[5]:对拦截机制的灵活定制
Dora.Interception,为.NET Core度身打造的AOP框架 [5]:轻松地实现与其他AOP框架的整合的更多相关文章
- Dora.Interception,为.NET Core度身打造的AOP框架:全新的版本
Dora.Interception 1.0(Github地址:可以访问GitHub地址:https://github.com/jiangjinnan/Dora)推出有一段时间了,最近花了点时间将它升级 ...
- Dora.Interception, 为.NET Core度身打造的AOP框架[4]:演示几个典型应用
为了帮助大家更深刻地认识Dora.Interception,并更好地将它应用到你的项目中,我们通过如下几个简单的实例来演示几个常见的AOP应用在Dora.Interception下的实现.对于下面演示 ...
- Dora.Interception, 为.NET Core度身打造的AOP框架:不一样的Interceptor定义方式
相较于社区其他主流的AOP框架,Dora.Interception在Interceptor提供了完全不同的编程方式.我们并没有为Interceptor定义一个接口,正是因为不需要实现一个预定义的接口, ...
- Dora.Interception, 为.NET Core度身打造的AOP框架[3]:Interceptor的注册
在<不一样的Interceptor>中我们着重介绍了Dora.Interception中最为核心的对象Interceptor,以及定义Interceptor类型的一些约定.由于Interc ...
- Dora.Interception, 一个为.NET Core度身打造的AOP框架:不一样的Interceptor定义方式
相较于社区其他主流的AOP框架,Dora.Interception在Interceptor提供了完全不同的编程方式.我们并没有为Interceptor定义一个接口,正是因为不需要实现一个预定义的接口, ...
- Dora.Interception, 一个为.NET Core度身打造的AOP框架[3]:Interceptor的注册
在<不一样的Interceptor>中我们着重介绍了Dora.Interception中最为核心的对象Interceptor,以及定义Interceptor类型的一些约定.由于Interc ...
- Dora.Interception,为.NET Core度身打造的AOP框架 [3]:多样化拦截器应用方式
在<以约定的方式定义拦截器>中,我们通过对拦截器的介绍了Dora.Interception的两种拦截机制,即针对接口的“实例拦截”针对虚方法的“类型拦截”.我们介绍了拦截器的本质以及基于约 ...
- Dora.Interception,为.NET Core度身打造的AOP框架 [1]:更加简练的编程体验
很久之前开发了一个名为Dora.Interception的开源AOP框架(github地址:https://github.com/jiangjinnan/Dora,如果你觉得这个这框架还有那么一点价值 ...
- Dora.Interception,为.NET Core度身打造的AOP框架 [4]:与依赖注入框架的无缝集成
Dora.Interception最初的定位就是专门针对.NET Core的AOP框架,所以在整个迭代过程中我大部分是在做减法.对于.NET Core程序开发来说,依赖注入已经成为无处不在并且“深入骨 ...
随机推荐
- Go依赖模块版本之Module避坑使用详解
前提 对于Go的版本管理主要用过 glide,下面介绍 Go 1.11 之后官方支持的版本管理工具 mod. 关于 mod 官方给出了三个命令 go help mod.go help modules. ...
- 高可用Redis(九):Redis Sentinel
1.主从复制高可用的问题 主从复制高可用的作用 1.为master提供备份,当master宕机时,slave有完整的备份数据 2.对master实现分流,实现读写分离 但是主从架构有一个问题 1.如果 ...
- 01-Linux操作系统+指令
一.Linux操作系统 操作系统定义:操作系统直接运行在计算机上的系统软件, 它是与硬件打交道和控制软件运行的计算机程序. 虚拟机:就是模拟一个真实的计算机,好比一个虚拟的电 ...
- DataTable插件通过js导出Excel
$('#myTab').DataTable( { serverSide: false,//分页,取数据等等的都放到服务端去. true为后台分页,每次点击分页时会请求后台数据,false为前台分页 d ...
- @PostConstruct 和 @PreConstruct
1.从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法.写法 ...
- PHP递归获取二维数组中指定key的值
$data = [ "resulterrorCode" => 0, "resultraw" => [ "result" => ...
- About The Order of The Declarations And Definition When Making a Member Function a Friend.关于使类成员成为另一个类友元函数的声明顺序和定义。
If only member function clear of WindowMgr is a friend of Screen, there are some points need to note ...
- 3d-tiles、gltf 坐标系
gltf 为 y 轴向上的右手坐标系 3d-tiles 为 z 轴向上的右手坐标系
- python url参数转dict
from urllib import parse url='_from=R40&LH_BIN=1&_sop=13&LH_Complete=1&LH_Sold=1& ...
- 迅雷最新bug已被找到!mac不用登录也可以极速下载了!
想体验迅雷不限速的快感吗?下载这款迅雷Mac(不限速免vip)免登录版吧!拥有了这款迅雷Mac破解版,电影.游戏等所有大文件都不在话下.体验极速的下载功能,尽在迅雷Mac(不限速免vip)破解版!需要 ...