欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

淺談C#AOP的簡單實(shí)現(xiàn)

前言:為了弄清楚AOP,博主也是拼了。這篇打算寫寫AOP,說起AOP,其實(shí)博主接觸這個概念也才幾個月,了解后才知道,原來之前自己寫的好多代碼原理就是基于AOP的,比如MVC的過濾器Filter,它里面的異常捕捉可以通過FilterAttribute,IExceptionFilter去處理,這兩個對象的處理機(jī)制內(nèi)部原理應(yīng)該就是AOP,只不過之前沒有這個概念罷了。

成都網(wǎng)站設(shè)計、做網(wǎng)站過程中,需要針對客戶的行業(yè)特點(diǎn)、產(chǎn)品特性、目標(biāo)受眾和市場情況進(jìn)行定位分析,以確定網(wǎng)站的風(fēng)格、色彩、版式、交互等方面的設(shè)計方向。創(chuàng)新互聯(lián)還需要根據(jù)客戶的需求進(jìn)行功能模塊的開發(fā)和設(shè)計,包括內(nèi)容管理、前臺展示、用戶權(quán)限管理、數(shù)據(jù)統(tǒng)計和安全保護(hù)等功能。

一、AOP概念

老規(guī)矩,還是先看官方解釋:AOP(Aspect-Oriented Programming,面向切面的編程),它是可以通過預(yù)編譯方式和運(yùn)行期動態(tài)代理實(shí)現(xiàn)在不修改源代碼的情況下給程序動態(tài)統(tǒng)一添加功能的一種技術(shù)。它是一種新的方法論,它是對傳統(tǒng)OOP編程的一種補(bǔ)充。OOP是關(guān)注將需求功能劃分為不同的并且相對獨(dú)立,封裝良好的類,并讓它們有著屬于自己的行為,依靠繼承和多態(tài)等來定義彼此的關(guān)系;AOP是希望能夠?qū)⑼ㄓ眯枨蠊δ軓牟幌嚓P(guān)的類當(dāng)中分離出來,能夠使得很多類共享一個行為,一旦發(fā)生變化,不必修改很多類,而只需要修改這個行為即可。AOP是使用切面(aspect)將橫切關(guān)注點(diǎn)模塊化,OOP是使用類將狀態(tài)和行為模塊化。在OOP的世界中,程序都是通過類和接口組織的,使用它們實(shí)現(xiàn)程序的核心業(yè)務(wù)邏輯是十分合適。但是對于實(shí)現(xiàn)橫切關(guān)注點(diǎn)(跨越應(yīng)用程序多個模塊的功能需求)則十分吃力,比如日志記錄,權(quán)限驗證,異常攔截等。

博主的理解:AOP就是將公用功能提取出來,如果以后公用功能的需求發(fā)生變化,只需要改動公用的模塊的代碼即可,多個調(diào)用的地方則不需要改動。所謂面向切面,就是只關(guān)注通用功能,而不關(guān)注業(yè)務(wù)邏輯。實(shí)現(xiàn)方式一般是通過攔截。比如,我們隨便一個Web項目基本都有的權(quán)限驗證功能,進(jìn)入每個頁面前都會校驗當(dāng)前登錄用戶是否有權(quán)限查看該界面,我們不可能說在每個頁面的初始化方法里面都去寫這段驗證的代碼,這個時候我們的AOP就派上用場了,AOP的機(jī)制是預(yù)先定義一組特性,使它具有攔截方法的功能,可以讓你在執(zhí)行方法之前和之后做你想做的業(yè)務(wù),而我們使用的時候只需要的對應(yīng)的方法或者類定義上面加上某一個特性就好了。

二、使用AOP的優(yōu)勢

博主覺得它的優(yōu)勢主要表現(xiàn)在:

1、將通用功能從業(yè)務(wù)邏輯中抽離出來,可以省略大量重復(fù)代碼,有利于代碼的操作和維護(hù)。

2、在軟件設(shè)計時,抽出通用功能(切面),有利于軟件設(shè)計的模塊化,降低軟件架構(gòu)的復(fù)雜度。也就是說通用的功能都是一個單獨(dú)的模塊,在項目的主業(yè)務(wù)里面是看不到這些通用功能的設(shè)計代碼的。

三、AOP的簡單應(yīng)用

為了說明AOP的工作原理,博主打算先從一個簡單的例子開始,通過靜態(tài)攔截的方式來了解AOP是如何工作的。

1、靜態(tài)攔截

public class Order
  {
    public int Id { set; get; }
    public string Name { set; get; }
    public int Count { set; get; }
    public double Price { set; get; }
    public string Desc { set; get; }
  }

  public interface IOrderProcessor
  {
    void Submit(Order order);
  }
  public class OrderProcessor : IOrderProcessor
  {
    public void Submit(Order order)
    {
      Console.WriteLine("提交訂單");
    }
  }

  public class OrderProcessorDecorator : IOrderProcessor
  {
    public IOrderProcessor OrderProcessor { get; set; }
    public OrderProcessorDecorator(IOrderProcessor orderprocessor)
    {
      OrderProcessor = orderprocessor;
    }
    public void Submit(Order order)
    {
      PreProceed(order);
      OrderProcessor.Submit(order);
      PostProceed(order);
    }
    public void PreProceed(Order order)
    {
      Console.WriteLine("提交訂單前,進(jìn)行訂單數(shù)據(jù)校驗....");
      if (order.Price < 0)
      {
        Console.WriteLine("訂單總價有誤,請重新核對訂單。");
      }
    }

    public void PostProceed(Order order)
    {
      Console.WriteLine("提交帶單后,進(jìn)行訂單日志記錄......");
      Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "提交訂單,訂單名稱:" + order.Name + ",訂單價格:" + order.Price);
    }
  }

調(diào)用代碼:

static void Main(string[] args)
    {
      Order order = new Order() { Id = 1, Name = "lee", Count = 10, Price = 100.00, Desc = "訂單測試" };
      IOrderProcessor orderprocessor = new OrderProcessorDecorator(new OrderProcessor());
      orderprocessor.Submit(order);
      Console.ReadLine();
    }

得到結(jié)果:

淺談C# AOP的簡單實(shí)現(xiàn)

上面我們模擬訂單提交的例子,在提交一個訂單前,我們需要做很多的準(zhǔn)備工作,比如數(shù)據(jù)有效性校驗等;訂單提交完成之后,我們還需要做日志記錄等。上面的代碼很簡單,沒有任何復(fù)雜的邏輯,從上面的代碼可以看出,我們通過靜態(tài)植入的方式手動在執(zhí)行方法前和執(zhí)行方法后讓它做一些我們需要的功能。AOP的實(shí)現(xiàn)原理應(yīng)該也是如此,只不過它幫助我們做了方法攔截,幫我們省去了大量重復(fù)代碼,我們要做的僅僅是寫好攔截前和攔截后需要處理的邏輯。

2、動態(tài)代理

了解了靜態(tài)攔截的例子,你是否對AOP有一個初步的認(rèn)識了呢。下面我們就來到底AOP該如何使用。按照園子里面很多牛人的說法,AOP的實(shí)現(xiàn)方式大致可以分為兩類:動態(tài)代理和IL 編織兩種方式。博主也不打算照本宣科,分別拿Demo來說話吧。下面就以兩種方式各選一個代表框架來說明。

動態(tài)代理方式,博主就以微軟企業(yè)庫(MS Enterprise Library)里面的PIAB(Policy Injection Application Block)框架來作說明。

首先需要下載以下幾個dll,然后添加它們的引用。

淺談C# AOP的簡單實(shí)現(xiàn)

然后定義對應(yīng)的Handler

public class User
  {
    public string Name { set; get; }
    public string PassWord { set; get; }
  }

  #region 1、定義特性方便使用
  public class LogHandlerAttribute : HandlerAttribute
  {
    public string LogInfo { set; get; }
    public int Order { get; set; }
    public override ICallHandler CreateHandler(IUnityContainer container)
    {
      return new LogHandler() { Order = this.Order, LogInfo = this.LogInfo };
    }
  }
  #endregion

  #region 2、注冊對需要的Handler攔截請求
  public class LogHandler : ICallHandler
  {
    public int Order { get; set; }
    public string LogInfo { set; get; }

    //這個方法就是攔截的方法,可以規(guī)定在執(zhí)行方法之前和之后的攔截
    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
      Console.WriteLine("LogInfo內(nèi)容" + LogInfo);
      //0.解析參數(shù)
      var arrInputs = input.Inputs;
      if (arrInputs.Count > 0)
      {
        var oUserTest1 = arrInputs[0] as User;
      }
      //1.執(zhí)行方法之前的攔截
      Console.WriteLine("方法執(zhí)行前攔截到了");
      //2.執(zhí)行方法
      var messagereturn = getNext()(input, getNext);

      //3.執(zhí)行方法之后的攔截
      Console.WriteLine("方法執(zhí)行后攔截到了");
      return messagereturn;
    }
  }
  #endregion

  #region 3、用戶定義接口和實(shí)現(xiàn)
  public interface IUserOperation
  {
    void Test(User oUser);
    void Test2(User oUser, User oUser2);
  }


  //這里必須要繼承這個類MarshalByRefObject,否則報錯
  public class UserOperation : MarshalByRefObject, IUserOperation
  {
    private static UserOperation oUserOpertion = null;
    public UserOperation()
    {
      //oUserOpertion = PolicyInjection.Create<UserOperation>();
    }

    //定義單例模式將PolicyInjection.Create<UserOperation>()產(chǎn)生的這個對象傳出去,這樣就避免了在調(diào)用處寫這些東西
    public static UserOperation GetInstance()
    {
      if (oUserOpertion == null)
        oUserOpertion = PolicyInjection.Create<UserOperation>();

      return oUserOpertion;
    }
    //調(diào)用屬性也會攔截
    public string Name { set; get; }

    //[LogHandler],在方法上面加這個特性,只對此方法攔截
    [LogHandler(LogInfo = "Test的日志為aaaaa")]
    public void Test(User oUser)
    {
      Console.WriteLine("Test方法執(zhí)行了");
    }

    [LogHandler(LogInfo = "Test2的日志為bbbbb")]
    public void Test2(User oUser, User oUser2)
    {
      Console.WriteLine("Test2方法執(zhí)行了");
    }
  }
  #endregion

最后我們來看調(diào)用的代碼:

static void Main(string[] args)
    {
      try
      {
        var oUserTest1 = new User() { Name = "test2222", PassWord = "yxj" };
        var oUserTest2 = new User() { Name = "test3333", PassWord = "yxj" };
        var oUser = UserOperation.GetInstance();
        oUser.Test(oUserTest1);
        oUser.Test2(oUserTest1,oUserTest2);
      }
      catch (Exception ex)
      {
        //throw;
      }
    }

得到結(jié)果如下:

淺談C# AOP的簡單實(shí)現(xiàn)

我們來看執(zhí)行Test()方法和Test2()方法時候的順序。

淺談C# AOP的簡單實(shí)現(xiàn)

由于Test()和Test2()方法上面加了LogHander特性,這個特性里面定義了AOP的Handler,在執(zhí)行Test和Test2方法之前和之后都會進(jìn)入Invoke()方法里面。其實(shí)這就是AOP的意義所在,將切面的通用功能在統(tǒng)一的地方處理,在主要邏輯里面直接用過特性使用即可。

3、IL編織

靜態(tài)織入的方式博主打算使用PostSharp來說明,一來這個使用起來簡單,二來項目中用過這種方式。

Postsharp從2.0版本就開始收費(fèi)了。為了說明AOP的功能,博主下載了一個免費(fèi)版本的安裝包,使用PostSharp與其它框架不太一樣的是一定要下載安裝包安裝,只引用類庫是不行的,因為上文說過,AOP框架需要為編譯器或運(yùn)行時添加擴(kuò)展。使用步驟如下:

(1)下載Postsharp安裝包,安裝。

(2)在需要使用AOP的項目中添加PostSharp.dll這個dll的引用。

(3)定義攔截的方法:

[Serializable]
  public class TestAop : PostSharp.Aspects.OnMethodBoundaryAspect
  {
     //發(fā)生異常時進(jìn)入此方法
    public override void OnException(MethodExecutionArgs args)
    {
      base.OnException(args);
    }

     //執(zhí)行方法前執(zhí)行此方法
    public override void OnEntry(MethodExecutionArgs args)
    {
      base.OnEntry(args);
    }

     //執(zhí)行方法后執(zhí)行此方法
    public override void OnExit(MethodExecutionArgs args)
    {
      base.OnExit(args);
    }
  }

注意這里的TestAop這個類必須要是可序列化的,所以要加上[Serializable]特性

(4)在需要攔截功能的地方使用。

在類上面加特性攔截,此類下面的所有的方法都會具有攔截功能。

[TestAop]public class Impc_TM_PLANT : Ifc_TM_PLANT
  {
    /// <summary>
    /// 獲取或設(shè)置服務(wù)接口。
    /// </summary>
    private Ic_TM_PLANTService service { get; set; }
    
    public IList<DTO_TM_PLANT> Find()
    {
      DTO_TM_PLANT otest = null;
      otest.NAME_C = "test";//異常,會進(jìn)入OnException方法
        return service.FindAll(); 
     }
  }

方法上面加特性攔截,只會攔截此方法。

[TestAop]
    public IList<DTO_TM_PLANT> Find()
    {
      DTO_TM_PLANT otest = null;
      otest.NAME_C = "test";
      return service.FindAll();
    }

有沒有感覺很簡單,很強(qiáng)大,其實(shí)這一簡單應(yīng)用,解決我們常見的日志、異常、權(quán)限驗證等功能簡直太小菜一碟了。當(dāng)然Postsharp可能還有許多更加高級的功能,有興趣可以深究下。

4、MVC里面的Filter

public class AOPFilterAttribute : ActionFilterAttribute, IExceptionFilter
  {

    public void OnException(ExceptionContext filterContext)
    {
      throw new System.NotImplementedException();
    }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      
      base.OnActionExecuting(filterContext);
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
      base.OnActionExecuted(filterContext);
    }
  }

在controller里面使用該特性:

[AOPFilter]
    public JsonResult GetEditModel(string strType)
    {
      var lstRes = new List<List<DragElementProp>>();
      var lstResPage = new List<PageProperty>();

       //.........todo

      return Json(new { lstDataAttr = lstRes, PageAttr = lstResPage, lstJsConnections = lstJsPlumbLines }, JsonRequestBehavior.AllowGet);
    }

調(diào)試可知,在執(zhí)行GetEditModel(string strType)方法之前,會先執(zhí)行OnActionExecuting()方法,GetEditModel(string strType)之后,又會執(zhí)行OnActionExecuted()方法。這在我們MVC里面權(quán)限驗證、錯誤頁導(dǎo)向、日志記錄等常用功能都可以方便解決。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

標(biāo)題名稱:淺談C#AOP的簡單實(shí)現(xiàn)
網(wǎng)頁URL:http://aaarwkj.com/article40/iipseo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、做網(wǎng)站、軟件開發(fā)網(wǎng)頁設(shè)計公司、云服務(wù)器、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
免费在线观看av日韩| 婷婷不卡中文字幕三区| 人妻大乳一区二区三区| 蜜桃精品国产一区二区三区| 亚洲国产中日韩精品综合| 91午夜福利视频免费播放| 日本中文字幕三级专区| 好色人妻在线播放中文字幕| 国产成人+亚洲欧洲综合| 日本黄色大波少妇网站| 亚州无吗一区二区三区| 日本在线一区二区视频麻豆| 蜜桃av网站免费观看| 色综合色很天天综合色| 亚洲熟女乱妇爽到高潮| 伊人久久亚洲福利精品| 在线观看高清国产黄色片| 亚洲熟女乱妇爽到高潮| 97在线视频观看视频在线| 国产精品一级二区三区| 中文字幕久精品视频免费| 国产一区二区三区在线精品专区| 日本一级特黄大片做受在线观看| 国产极品嫩模在线观看91| 日韩精品中文字幕人妻系列| 亚洲精品一区二区99| 十八岁毛片一区二区三区| 欧美日韩国产天天干| 国产男女爱猛视频在线| 久久精品国产亚洲av超一| 色综合视频二区偷拍在线| 一区二区三区日韩欧美在线 | 亚洲人妻av一区二区| 青青草成人公开在线视频| av影片免费网址大全| 欧美国产精品中文字幕| 午夜香蕉av一区二区三区| 国产一区二区av免费| 亚洲欧美综合精品久久成人| 国产成人精品久久久亚洲| 人妻有码一区二区三区|