<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        .NET Core類庫System.Reflection.DispatchProxy實現簡易Aop的方法

        來源:懂視網 責編:小采 時間:2020-11-27 22:34:40
        文檔

        .NET Core類庫System.Reflection.DispatchProxy實現簡易Aop的方法

        .NET Core類庫System.Reflection.DispatchProxy實現簡易Aop的方法:前言 aop即是面向切面編程,眾多Aop框架里Castle是最為人所知的,另外還有死去的Spring.NET,當然,.NET Core社區新秀AspectCore在性能與功能上都非常優秀,已經逐漸被社區推崇和有越來越多的人使用。感謝檸檬同學的禮物! 如果大家出于自身需求或者學習,想
        推薦度:
        導讀.NET Core類庫System.Reflection.DispatchProxy實現簡易Aop的方法:前言 aop即是面向切面編程,眾多Aop框架里Castle是最為人所知的,另外還有死去的Spring.NET,當然,.NET Core社區新秀AspectCore在性能與功能上都非常優秀,已經逐漸被社區推崇和有越來越多的人使用。感謝檸檬同學的禮物! 如果大家出于自身需求或者學習,想

        前言

        aop即是面向切面編程,眾多Aop框架里Castle是最為人所知的,另外還有死去的Spring.NET,當然,.NET Core社區新秀AspectCore在性能與功能上都非常優秀,已經逐漸被社區推崇和有越來越多的人使用。感謝檸檬同學的禮物!

        如果大家出于自身需求或者學習,想實現一個Aop,是不是覺得一來就要使用Emit去做?最近我了解到了System.Reflection.DispatchProxy這個corefx類庫,已經實現了動態代理功能。

        1|1System.Reflection.DispatchProxy

        下面演示一下它的使用方法:

        class Program
        {
         static void Main(string[] args)
         {
         //創建代理類,并把SampleProxy作為攔截器注入
         var sampleProxy = (targetInterface)SampleProxy.Create<targetInterface, SampleProxy>();
         //執行接口方法
         sampleProxy.Write("here is invoke by proxy");
         }
        }
        
        //需要被生成代理實例的接口
        public interface targetInterface
        {
         //這個方法會被代理類實現
         void Write(string writesomeshing);
        }
        
        public class SampleProxy : DispatchProxy
        {
         /// <summary>
         /// 攔截調用
         /// </summary>
         /// <param name="method">所攔截的方法信息</param>
         /// <param name="parameters">所攔截方法被傳入的參數指</param>
         /// <returns></returns>
         protected override object Invoke(MethodInfo targetMethod, object[] args)
         {
         Console.WriteLine(args[0]);
         return null;
         }
        }

        2|0改造成一款簡易AOP

        2|1為什么?

        System.Reflection.DispatchProxy只有一個Api,就是objecct Create<T,TProxy>() where TProxy:DispatchProxy,約束了只能傳入泛型參數,并不能從方法傳入類型,這就會帶來很多問題。而更可氣的是,給官方提了issue之后,還是不給增加這個api……

        2|2改造方法

        幸好,在那個issue下,issue作者提供了一個解決方案,就是用反射來構造這個泛型方法。我還在這基礎上,封裝了一下,加入了傳入攔截器實例和傳入攔截器構造方法參數的功能。

        /// <summary>
        /// 攔截器接口
        /// </summary>
        public interface IInterceptor
        {
         /// <summary>
         /// 攔截器調用
         /// </summary>
         /// <param name="target">代理實例</param>
         /// <param name="method">所攔截的方法</param>
         /// <param name="parameters">所攔截方法傳入的參數值</param>
         /// <returns>返回值會傳遞給方法返回值</returns> 
         object Intercept(object target, MethodInfo method, object[] parameters);
        }

        攔截器要實現這個接口,下面是對DispatchProxy的封裝,實現更多創建代理實例的方法

        public class ProxyGenerator : DispatchProxy
        {
         private IInterceptor interceptor { get; set; }
        
         /// <summary>
         /// 創建代理實例
         /// </summary>
         /// <param name="targetType">所要代理的接口類型</param>
         /// <param name="interceptor">攔截器</param>
         /// <returns>代理實例</returns>
         public static object Create(Type targetType, IInterceptor interceptor)
         {
         object proxy = GetProxy(targetType);
         ((ProxyGenerator)proxy).CreateInstance(interceptor);
         return proxy;
         }
        
         /// <summary>
         /// 創建代理實例
         /// </summary>
         /// <param name="targetType">所要代理的接口類型</param>
         /// <param name="interceptorType">攔截器類型</param>
         /// <param name="parameters">攔截器構造函數參數值</param>
         /// <returns>代理實例</returns>
         public static object Create(Type targetType, Type interceptorType, params object[] parameters)
         {
         object proxy = GetProxy(targetType);
         ((ProxyGenerator)proxy).CreateInstance(interceptorType, parameters);
         return proxy;
         }
        
        
         /// <summary>
         /// 創建代理實例 TTarget:所要代理的接口類型 TInterceptor:攔截器類型
         /// </summary>
         /// <param name="parameters">攔截器構造函數參數值</param>
         /// <returns>代理實例</returns>
         public static TTarget Create<TTarget, TInterceptor>(params object[] parameters) where TInterceptor : IInterceptor
         {
         var proxy = GetProxy(typeof(TTarget));
         ((ProxyGenerator)proxy).CreateInstance(typeof(TInterceptor), parameters);
         return (TTarget)proxy;
         }
        
         private static object GetProxy(Type targetType)
         {
         var callexp = Expression.Call(typeof(DispatchProxy), nameof(DispatchProxy.Create), new[] { targetType, typeof(ProxyGenerator) });
         return Expression.Lambda<Func<object>>(callexp).Compile()();
         }
        
         private void CreateInstance(Type interceptorType, object[] parameters)
         {
         var ctorParams = parameters.Select(x => x.GetType()).ToArray();
         var paramsExp = parameters.Select(x => Expression.Constant(x));
         var newExp = Expression.New(interceptorType.GetConstructor(ctorParams), paramsExp);
         this.interceptor = Expression.Lambda<Func<IInterceptor>>(newExp).Compile()();
         }
        
         private void CreateInstance(IInterceptor interceptor)
         {
         this.interceptor = interceptor;
         }
        
         protected override object Invoke(MethodInfo method, object[] parameters)
         {
         return this.interceptor.Intercept(method, parameters);
         }
        }

        2|3使用方法

         class Program
         {
         static void Main(string[] args)
         {
         var poxy1 = (targetInterface)ProxyGenerator.Create(typeof(targetInterface), new SampleProxy("coreproxy1"));
         poxy1.Write("here was invoked"); //---> "here was invoked by coreproxy1"
        
         var poxy2 = (targetInterface)ProxyGenerator.Create(typeof(targetInterface), typeof(SampleProxy), "coreproxy2");
         poxy2.Write("here was invoked"); //---> "here was invoked by coreproxy2"
        
         var poxy3 = ProxyGenerator.Create<targetInterface, SampleProxy>("coreproxy3");
         poxy3.Write("here was invoked"); //---> "here was invoked by coreproxy3"
         }
         }
        
        
         public class SampleProxy : IInterceptor
         {
         private string proxyName { get; }
        
         public SampleProxy(string name)
         {
         this.proxyName = name;
         }
        
         public object Intercept(MethodInfo method, object[] parameters)
         {
         Console.WriteLine(parameters[0] + " by " + proxyName);
         return null;
         }
         }
        
         public interface targetInterface
         {
         void Write(string writesome);
         }

        3|0總結

        總結一下就是,微軟爸爸給我們的這個輪子還是即輕便又很好用的。

        本文的實例代碼可以在我的github上找到:https://github.com/ElderJames/CoreProxy

        好了,

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        .NET Core類庫System.Reflection.DispatchProxy實現簡易Aop的方法

        .NET Core類庫System.Reflection.DispatchProxy實現簡易Aop的方法:前言 aop即是面向切面編程,眾多Aop框架里Castle是最為人所知的,另外還有死去的Spring.NET,當然,.NET Core社區新秀AspectCore在性能與功能上都非常優秀,已經逐漸被社區推崇和有越來越多的人使用。感謝檸檬同學的禮物! 如果大家出于自身需求或者學習,想
        推薦度:
        標簽: net core aop
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产精品人人做人人爱| 一个人免费观看视频www| 国产一区二区三区在线观看免费| 亚洲不卡中文字幕| 57pao一国产成视频永久免费| 亚洲AV无码成人精品区蜜桃 | 亚洲国产精品无码久久青草| 国产成人 亚洲欧洲| 免费一区二区三区四区五区| 国内成人精品亚洲日本语音| 亚洲精品专区在线观看| 国产高潮久久免费观看| 精品亚洲综合久久中文字幕| 久久九九AV免费精品| 亚洲第一页在线视频| 国产精品成人免费一区二区 | 午夜视频免费在线观看| 亚洲日本精品一区二区| 男女超爽刺激视频免费播放| 亚洲欧美aⅴ在线资源| 亚洲AⅤ无码一区二区三区在线 | 亚洲av无码成人黄网站在线观看 | 国产区在线免费观看| 久久精品国产亚洲| 可以免费看的卡一卡二| 在线看亚洲十八禁网站| 国产亚洲人成无码网在线观看| 最近2019免费中文字幕6| 亚洲成熟丰满熟妇高潮XXXXX | 久久国内免费视频| 亚洲av无码专区在线电影天堂| 亚洲精品人成无码中文毛片| 亚洲精品免费视频| 亚洲欧美不卡高清在线| 亚洲熟妇无码乱子AV电影| 国产成人精品免费视频大全麻豆 | 久久WWW免费人成人片| 久久国产精品免费一区二区三区| 亚洲精品视频在线| 亚洲第一成人影院| 亚洲黄色免费电影|