最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#開源的AOP框架--KingAOP基礎(chǔ)

 更新時(shí)間:2015年12月10日 09:43:12   作者:JackWang-CUMT  
這篇文章主要介紹了一款C#開源的AOP框架--KingAOP框架的基礎(chǔ)知識(shí),對(duì)于想學(xué)習(xí)AOP的小伙伴來說,非常不錯(cuò),希望大家能夠喜歡。

  AOP面向切面編程(Aspect Oriented Programming),是通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。Spring框架用的核心技術(shù)就是AOP,是函數(shù)式編程的一種衍生范型。利用AOP的好處就是可以對(duì)業(yè)務(wù)邏輯進(jìn)行隔離,降低耦合度,提高程序的可重用性,同時(shí)提高了開發(fā)的效率。開源的AOP也有不少,我這里用的KingAOP.

1 項(xiàng)目結(jié)構(gòu)

2 定義一個(gè)日志記錄的實(shí)體類User和LoggingAspect切面日志類

namespace AOPDemo.Logging
{
 class User
 {
  public int ID { get; set; }
  public string Name { get; set; }
  public string Pwd{get;set;}
  public string IP { get; set; }
  public string State { get; set; }
  public System.DateTime LoginTime { get; set; }

 }
}

 

using System;
using System.Text;
using KingAOP.Aspects;

namespace AOPDemo.Logging
{
 internal class LoggingAspect : OnMethodBoundaryAspect
 {
  public override void OnEntry(MethodExecutionArgs args)
  {
   string logData = CreateLogData("Entering", args);
   Console.WriteLine(logData);
  }

  public override void OnExit(MethodExecutionArgs args)
  {
   string logData = CreateLogData("Leaving", args);
   Console.WriteLine(logData);
  }
  /// <summary>
  /// AOP對(duì)于登錄日志邏輯,只需在此進(jìn)行修改即可,無需修改被切面的處理類
  /// </summary>
  /// <param name="methodStage"></param>
  /// <param name="args"></param>
  /// <returns></returns>
  private string CreateLogData(string methodStage, MethodExecutionArgs args)
  {
   var str = new StringBuilder();
   str.AppendLine();
   str.AppendLine(string.Format(methodStage + " {0} ", args.Method));
   foreach (var argument in args.Arguments)
   {
    var argType = argument.GetType();

    str.Append(argType.Name + ": ");

    if (argType == typeof(string) || argType.IsPrimitive)
    {
     str.Append(argument);
    }
    else
    {
     foreach (var property in argType.GetProperties())
     {
      str.AppendFormat("{0} = {1}; ",
       property.Name, property.GetValue(argument, null));
     }
    }
   }
   return str.ToString();
  }
 }
}

3 Login類

該類必須實(shí)現(xiàn)IDynamicMetaObjectProvider的GetMetaObject方法,同時(shí)在需要切面的方法上用屬性[LoggingAspect]進(jìn)行標(biāo)注,LoggingAspect屬性也就是我們上面定義的LoggingAspect切片處理類.

using System.Dynamic;
using System.Linq.Expressions;
using KingAOP;
namespace AOPDemo.Logging
{
 /// <summary>
 /// 登錄邏輯處理,只需添加一個(gè)LoggingAspect即可實(shí)現(xiàn)日志功能,達(dá)到邏輯和通用處理的邏輯分離
 /// </summary>
 internal class Login : IDynamicMetaObjectProvider
 {
  //添加登錄切面
  [LoggingAspect] 
  public void LoginValdate(User entity)
  {
   //只需進(jìn)行業(yè)務(wù)邏輯處理,無需進(jìn)行日志處理
   if (entity.Name == "jack" && entity.Pwd == "wang")
   {
    entity.State = "Logged";
   }
   else
   {
    entity.State = "Error";
   }
   

  }
  /// <summary>
  /// IDynamicMetaObjectProvider的實(shí)現(xiàn)
  /// </summary>
  /// <param name="parameter"></param>
  /// <returns></returns>
  public DynamicMetaObject GetMetaObject(Expression parameter)
  {
   //need for AOP weaving
   return new AspectWeaver(parameter, this);
  }
 }
}

調(diào)試代碼如下:

//測(cè)試感覺KingAOP必須有一個(gè)dynamic才能切面
Logging.Login test = new Logging.Login();
dynamic entity = new Logging.User { Name = "Jon", ID = 99,Pwd="wang",State="",LoginTime=System.DateTime.Now};
test.LoginValdate(entity);

相關(guān)文章

  • c# 提取文檔信息的示例

    c# 提取文檔信息的示例

    這篇文章主要介紹了c# 提取文檔信息的示例,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2021-02-02
  • C#如何提取經(jīng)緯度文件中的經(jīng)緯度數(shù)據(jù)

    C#如何提取經(jīng)緯度文件中的經(jīng)緯度數(shù)據(jù)

    近期開發(fā)時(shí)需要獲取當(dāng)前的經(jīng)緯度坐標(biāo),下面這篇文章主要給大家介紹了關(guān)于C#如何提取經(jīng)緯度文件中經(jīng)緯度數(shù)據(jù)的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • c# 識(shí)別圖片格式的方法

    c# 識(shí)別圖片格式的方法

    這篇文章主要介紹了c# 識(shí)別圖片格式的方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-02-02
  • c# WinForm 窗體之間傳值的幾種方式(小結(jié))

    c# WinForm 窗體之間傳值的幾種方式(小結(jié))

    這篇文章主要介紹了WinForm 窗體之間傳值的幾種方式(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • C# Winform實(shí)現(xiàn)石頭剪刀布游戲

    C# Winform實(shí)現(xiàn)石頭剪刀布游戲

    這篇文章主要為大家詳細(xì)介紹了Winform實(shí)現(xiàn)石頭剪刀布游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C#實(shí)現(xiàn)跑馬燈效果的示例代碼

    C#實(shí)現(xiàn)跑馬燈效果的示例代碼

    跑馬燈效果,功能效果大家應(yīng)該都知道,就是當(dāng)我們的文字過長,整個(gè)頁面放不下的時(shí)候(一般用于公告等),可以讓它自動(dòng)實(shí)現(xiàn)來回滾動(dòng)。本文將利用C#實(shí)現(xiàn)這一效果,感興趣的可以了解一下
    2022-11-11
  • C#讀取QQ純真IP數(shù)據(jù)庫QQWry.Dat的代碼

    C#讀取QQ純真IP數(shù)據(jù)庫QQWry.Dat的代碼

    QQ純真IP庫算是IP地址收集較為全的一個(gè)IP庫,對(duì)于IP查詢來說這個(gè)是不錯(cuò)的選擇。下面是如何查詢純真IP庫的一個(gè)類,使用C#代碼。
    2007-03-03
  • C#實(shí)現(xiàn)中文驗(yàn)證碼的示例代碼

    C#實(shí)現(xiàn)中文驗(yàn)證碼的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)中文驗(yàn)證碼功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12
  • 深入解析C#設(shè)計(jì)模式中對(duì)橋接模式的具體運(yùn)用

    深入解析C#設(shè)計(jì)模式中對(duì)橋接模式的具體運(yùn)用

    這篇文章主要介紹了C#設(shè)計(jì)模式中對(duì)橋接模式的具體運(yùn)用,橋接模式所強(qiáng)調(diào)的解耦在代碼維護(hù)中非常有用,需要的朋友可以參考下
    2016-02-02
  • C#使用private font改變PDF文件的字體詳解

    C#使用private font改變PDF文件的字體詳解

    這篇文章主要給大家介紹了關(guān)于C#使用private font改變PDF文件的字體的相關(guān)資料,文中通過示例代碼以及圖片介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07

最新評(píng)論

万州区| 康平县| 新安县| 普兰店市| 三河市| 潜江市| 张家港市| 咸丰县| 同仁县| 枝江市| 瓦房店市| 湖南省| 玉屏| 开平市| 读书| 安图县| 东莞市| 县级市| 太保市| 德兴市| 如东县| 鹤峰县| 长沙市| 富阳市| 广灵县| 肇东市| 天水市| 沙洋县| 安图县| 丁青县| 天气| 綦江县| 南华县| 会宁县| 靖西县| 韶山市| 锡林浩特市| 清水县| 衢州市| 鄂温| 措美县|