Dora.Interception,为.NET Core度身打造的AOP框架 [5]:轻松地实现与其他AOP框架的整合...
一、IInterceptingProxyFactory
對于Dora.Interception來說,方法調(diào)用之所有能夠被攔截的根源在于我們改變了服務(wù)實例的提供方式,原來的對象被替換成了可被攔截的代理對象。針對代理對象的提供體現(xiàn)在如下這個IInterceptingProxyFactory接口上。如果提供類型體現(xiàn)為一個接口,Wrap方法會被調(diào)用來創(chuàng)建一個封裝目標(biāo)對象的代理(如果不需要被攔截,則直接返回目標(biāo)對象);如果提供類型體現(xiàn)為一個類型,Create方法則被用來實現(xiàn)對代理對象的創(chuàng)建,如果不需要被攔截,方法提供的后面兩個參數(shù)會被用來提供目標(biāo)對象。
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提供了如下一個實現(xiàn)了IInterceptingProxyFactory接口的基類InterceptingProxyFactoryBase。后者幫助我們實現(xiàn)針對攔截器的解析,解析后的攔截器體現(xiàn)為一個InterceptorDecoration對象。作為它的派生類型只需要實現(xiàn)兩個受保護的虛方法Wrap和Create根據(jù)解析出來的攔截器實現(xiàn)可被攔截的代理對象的創(chuàng)建。
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, 我們可以得到應(yīng)用到目標(biāo)類型中所有方法(包括屬性的Get和Set方法)上的攔截器(實際上所有攔截器按照指定順序構(gòu)建而成的攔截器管道,最終體現(xiàn)為一個類型為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實現(xiàn)只需要按照普通的服進行注冊即可。
三、針對Castle的集成
由于Castle原生的框架并沒有提供針對Task的支持,所以我們利用另一個名為Castle.Core.AsyncInterceptor將Castle的攔截實現(xiàn)整合到Dora.Interception。具體的實現(xiàn)體現(xiàn)在如下這個DynamicProxyFactory中。該類型對應(yīng)的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的攔截實現(xiàn)機制,我們只需要做如下的設(shè)置即可。
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]:多樣性的攔截器應(yīng)用方式
[4]:與依賴注入框架的深度整合
[5]:對攔截機制的靈活定制
微信公眾賬號:大內(nèi)老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術(shù)資料,可以掃描左邊二維碼(或者長按識別二維碼)關(guān)注個人公眾號)。
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。 *****轉(zhuǎn)載:https://www.cnblogs.com/artech/p/dora-interception-05.html
轉(zhuǎn)載于:https://www.cnblogs.com/linybo/p/10053040.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Dora.Interception,为.NET Core度身打造的AOP框架 [5]:轻松地实现与其他AOP框架的整合...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: json字符串与对象互相转换
- 下一篇: 分享云及人工智能的一些学习资源和学习心得