<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【代碼設計】C# 實現 AOP 面向切面編程

          簡單記錄一下對AOP的認識,正文為3個部分

          一、AOP由來

          二、用DispatchProxy動態代理實現AOP

          三、通過特性標記,處理多種不同執行前、執行后的邏輯編排

       

      一、AOP 由來

          IUserHelper userHelper = new CommonUserHelper();
      // commonUser.Create中存在 方法執行前、方法執行后的業務邏輯 userHelper.Create("test0401_A"); public interface IUserHelper { void Create(string name); } public class CommonUserHelper : IUserHelper { private void before() { Console.WriteLine("CommonUser before"); } private void after() { Console.WriteLine("CommonUser after"); } public void Create(string name) { before(); Console.WriteLine($" Common User : {name} Created !"); after(); } }

      CommonUserHelper 實現 IUserHelper 接口,假設希望在 Create方法執行前/后寫入日志,那就存在這4種業務邏輯:

        ① 執行前寫入日志,執行 Create

        ② 執行前寫入日志,執行 Create,執行后寫入日志

        ③ 執行 Create,執行后寫入日志

        ④ 執行 Create

        單一個寫日志的需求,就能有4種實現方式,極端情況下,是可以實現 4次 Create 方法;

        如果再加一個數據驗證、IP驗證、權限驗證、異常處理、加入緩存..,那么實現的排列組合方式就更多了,

        無窮盡地加實現、替換類,這顯然不是我們希望的。

      AOP,Aspect Oriented Programing,是一種編程思維,是對這種缺陷的補充。

       

      二、DispatchProxy (動態代理)實現AOP

      using System.Reflection;
      namespace Cjm.AOP
      {
          public class TransformProxy
          {
              public static T GetDynamicProxy<T>(T instance)  
              {
                  // DispatchProxy 是system.Reflection封裝的類
                  // 用以創建實現接口T的代理類CustomProxy的實例
                  dynamic obj = DispatchProxy.Create<T, CustomProxy<T>>();
                  obj.Instance = instance;
                  return (T)obj;
              }
          }
      
          // DispatchProxy 是抽象類,
          // 實現該類的實例,實例方法執行是會跳轉到 Invoke 方法中,
          // 以此達到不破壞實際執行的具體邏輯,而又可以在另外的地方實現執行前、執行后
          public class CustomProxy<T> : DispatchProxy
          {
              public T Instance { get; set; }
              protected override object? Invoke(MethodInfo? targetMethod, object?[]? args)
              {
                  BeforeProcess();
                  var relt = targetMethod?.Invoke(Instance, args);
                  AfterProcess();
                  return relt;
              }
      
              private void BeforeProcess()
              {
                  Console.WriteLine($"This is BegoreProcess.");
              }
      
              private void AfterProcess()
              {
                  Console.WriteLine($"This is AfterProcess.");
              }
          }
      }
      
          // Main
          IUserHelper userHelper3 = new CommonUserHelper();
          userHelper3 = TransformProxy.GetDynamicProxy(userHelper3);
          userHelper3.Create("test0401_B");

       

      三、通過標記特性,處理多種不同的執行前/執行后方法

        此處借用Castle.Core的封裝(可通過Nuget管理下載),

        通過實現 StandardInterceptor以重寫 執行前/執行后 邏輯的封裝方式,

        我們可以更加聚焦在如何處理多種 執行前/執行后 邏輯的編排上。

      using Castle.DynamicProxy;
      {
          ProxyGenerator proxy = new ProxyGenerator();
          CustomInterceptor customInterceptor = new CustomInterceptor();
          IUserHelper commonUserHelper = new CommonUserHelper();
          var userHelperProxy = proxy.CreateInterfaceProxyWithTarget<IUserHelper>(commonUserHelper, customInterceptor);
          userHelperProxy.Create("TEST0401_C");
      }    
          public class CustomInterceptor : StandardInterceptor
          {
              protected override void PreProceed(IInvocation invocation)
              {
                  var method = invocation.Method;
                  //if (method.IsDefined(typeof(LogBeforeAttribute), true))
                  //{
                  //    Console.WriteLine("LOG : CustomInterceptor.PreProceed");
                  //}
      
                  Action<IInvocation> action = (invocation) => base.PreProceed(invocation);
                  // 獲取該方法的所有繼承BaseAOPAttribute的特性
                  var attrs = method.GetCustomAttributes<BaseAOPAttribute>(true);
      // 對于 attrs 的排列順序,可以在特性的實現中增加 int order 屬性,在標記特性時寫入排序編號
      foreach(var attr in attrs) { // 這里是俄羅斯套娃 // 相當于 attr3.AOPAction(invocation, attr2.AOPAction(invocation, attr1.AOPAction(invocation, base.PreProceed(invocation)))) action = attr.AOPAction(invocation, action); } action.Invoke(invocation); } protected override void PerformProceed(IInvocation invocation) { Console.WriteLine("CustomInterceptor.PerformProceed"); base.PerformProceed(invocation); } protected override void PostProceed(IInvocation invocation) { var method = invocation.Method; if (method.IsDefined(typeof(LogAfterAttribute), true)) { Console.WriteLine("LOG : CustomInterceptor.PostProceed"); } base.PreProceed(invocation); } }
          public class LogBeforeAttribute : Attribute {}
      
          public class LogAfterAttribute : Attribute {}
      
          public class CheckIPAttribute : BaseAOPAttribute
          {
              public override Action<IInvocation> AOPAction(IInvocation invocation, Action<IInvocation> action)
              {
                  return (invocation) => {
                      Console.WriteLine("CheckIP ..");
                      action.Invoke(invocation); 
      }; } }
      public abstract class BaseAOPAttribute : Attribute { public abstract Action<IInvocation> AOPAction(IInvocation invocation, Action<IInvocation> action); }

        通過給方法標記特性的方式,達到切面編程的目的(不影響原有實現,而增加實現執行前/執行后的邏輯)

          public interface IUserHelper
          {
              [LogBefore]
              [LogAfter]
              [CheckIP]
              void Create(string name);
      
              void CreateNoAttri();
          }

       

      ============================================================

      具體的AOP實現上需要考慮的問題多如牛毛,此處僅做簡單的思路介紹。

      以上主要參考自 B站 朝夕教育 2022 .Net Core AOP實現。

       

      posted @ 2023-04-02 11:07  Carcar019  閱讀(1215)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧美日韩人成综合在线播放| 国产国语对白露脸正在播放| 日韩一区二区在线看精品| 漂亮人妻被修理工侵犯| 中文日产幕无线码一区中文| 亚洲日本国产精品一区| 天堂av资源在线免费| 熟女精品视频一区二区三区| 亚洲一二三四区中文字幕| 欧美丰满熟妇xxxx性| 好男人官网资源在线观看| 国产国语一级毛片| 色婷婷综合久久久久中文字幕| 日韩一区二区三区精彩视频| 人人做人人澡人人人爽| 亚洲码国产精品高潮在线| 贺兰县| 欧洲免费一区二区三区视频| 女人喷水高潮时的视频网站| 国产高潮刺激叫喊视频| 成人亚洲a片v一区二区三区动漫 | 亚洲毛片多多影院| 爽爽精品dvd蜜桃成熟时电影院| 中国老太婆video| 亚洲国产精品日韩av专区| 久久亚洲av午夜福利精品一区| 国产精品普通话国语对白露脸| 久久老熟妇精品免费观看| 另类 专区 欧美 制服| 又大又硬又爽免费视频| 成人国产一区二区三区精品| 亚洲女初尝黑人巨| 亚洲av第二区国产精品| 国产办公室秘书无码精品99| 真实国产精品视频400部| av亚洲在线一区二区| 国产精品麻豆欧美日韩ww | 麻豆一区二区三区精品视频| 国产精品成| 日韩精品亚洲专区在线观看| 最新亚洲av日韩av二区|