欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

2 定義一個日志記錄的實體類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對于登錄日志邏輯,只需在此進行修改即可,無需修改被切面的處理類
  /// </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類

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

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

  }
  /// <summary>
  /// IDynamicMetaObjectProvider的實現(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)試代碼如下:

//測試感覺KingAOP必須有一個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)文章

最新評論