KingAOP
using KingAOP.Aspects;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Dynamic;
using System.Linq;
using System.Reflection;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
using System.Linq.Expressions;
using KingAOP;
namespace ConsoleApplication5
{
/// <summary>
/// aop日志拦截示例 使用KingAOP
/// </summary>
class Program
{
static void Main(string[] args)
{
Login test = new Login();
dynamic entity = new User { ID = 99, Name = "Jon", Pwd = "wang", State = "", LoginTime = System.DateTime.Now };
test.LoginValdate(entity);
Console.Read();
}
}
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public string Pwd { get; set; }
public string State { get; set; }
public System.DateTime LoginTime { get; set; }
}
/// <summary>
/// 创建一个日志切面处理类
/// </summary>
public class LoggingAspect : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
string logData = CreateLogData("entering", args);
Console.WriteLine(logData);
}
public override void OnException(MethodExecutionArgs args)
{
string logData = CreateLogData("exception", args);
Console.WriteLine(logData);
}
public override void OnSuccess(MethodExecutionArgs args)
{
string logData = CreateLogData("success", args);
Console.WriteLine(logData);
}
public override void OnExit(MethodExecutionArgs args)
{
string logData = CreateLogData("exiting", 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();
}
}
/// <summary>
/// 该类需要继承IDynamicMetaObjectProvider,因为KingAOP是基于动态类型进行操作和绑定的,如不继承是不会进入到刷选器中的相应事件里
/// 登录功能,只需添加一个LoggingAspect即可实现日志功能,达到业务逻辑和通用处理逻辑的分离
/// </summary>
public class Login : IDynamicMetaObjectProvider
{
//添加处理日志切面
[LoggingAspect]
public void LoginValdate(User entity)
{
//只需进行业务逻辑处理,无需进行日志处理,日志处理交给切面处理
if (entity.Name == "jack" && entity.Pwd == "wang")
{
entity.State = "Logged";
}
else
{
entity.State = "Error";
}
}
/// <summary>
/// 该类必须实现IDynamicMetaObjectProvider的GetMetaObject方法
/// </summary>
/// <param name="parameter"></param>
/// <returns></returns>
public DynamicMetaObject GetMetaObject(Expression parameter)
{
return new AspectWeaver(parameter, this);
}
}
}
浙公网安备 33010602011771号