<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
        主站蜘蛛池模板: 香蕉视频在线观看亚洲| 日本亚洲欧洲免费天堂午夜看片女人员 | 亚洲私人无码综合久久网| 久99久精品免费视频热77| 亚洲av之男人的天堂网站| 国产午夜无码精品免费看动漫| 久久久青草青青国产亚洲免观| 一区二区三区免费视频播放器| 亚洲人成网站色在线入口| 一级A毛片免费观看久久精品| 亚洲精品国产高清嫩草影院| 国产在线观看xxxx免费| 亚洲AV无码日韩AV无码导航| 91久久青青草原线免费| 国产亚洲精品bv在线观看| 日本免费一区二区三区最新| 疯狂做受xxxx高潮视频免费| 精品国产人成亚洲区| 免费无码H肉动漫在线观看麻豆| 亚洲an天堂an在线观看| 国产一卡2卡3卡4卡无卡免费视频| 亚洲影院天堂中文av色| 免费少妇a级毛片人成网| 国产免费一区二区视频| 亚洲国产精品xo在线观看| 日本不卡视频免费| 精选影视免费在线 | 亚洲同性男gay网站在线观看| 女人张开腿等男人桶免费视频| 成人免费观看男女羞羞视频| 久久精品国产亚洲av成人| 国产精品美女午夜爽爽爽免费| 日韩色视频一区二区三区亚洲| 亚洲成在人线中文字幕| 24小时日本在线www免费的| 四虎成人精品国产永久免费无码| 亚洲一区二区三区电影| 国产免费资源高清小视频在线观看| baoyu116.永久免费视频| 亚洲一区二区三区高清不卡| 亚洲午夜日韩高清一区|