本文继续上篇讲述一下比较复杂点的AOP例子,先新建一个控制台项目,然后同样先在Nuget中搜索安装KingAop到项目中

1、项目结构

2 、定义一个登录实体类User和LoggingAspect切面日志类

 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();
}
}

3、定义一个登录业务类Login,并且继承IDynamicMetaObjectProvider类

    /// <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);
}
}

4、接下来就是测试代码,如下

    class Program
{
static void Main(string[] args)
{
//复杂例子
Login test = new Login();
dynamic entity = new User { ID = , Name = "Jon", Pwd = "wang", State = "", LoginTime = System.DateTime.Now };
test.LoginValdate(entity); Console.Read();
}
}

C#使用KingAOP实现AOP面向切面编程二的更多相关文章

  1. C#使用KingAOP实现AOP面向切面编程一

    AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 实现AOP主要由两种方式,一种是编译时静态植入,优点是 ...

  2. AOP 面向切面编程, Attribute在项目中的应用

    一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...

  3. AOP面向切面编程的四种实现

     一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...

  4. Javascript aop(面向切面编程)之around(环绕)

    Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...

  5. Method Swizzling和AOP(面向切面编程)实践

    Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...

  6. [转] AOP面向切面编程

    AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...

  7. C# AOP 面向切面编程之 调用拦截

    有时候我们需要在代码中对方法调用进行拦截,并修改参数和返回值,这种操作叫做AOP(面向切面编程) 不过需要注意的是,AOP的效率很慢,在需要高效率场合慎用. 以下是C#的AOP方法: 首先建立一个控制 ...

  8. 【原创】Android AOP面向切面编程AspectJ

    一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...

  9. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...

随机推荐

  1. mysql修改default值

    ALTER TABLE xxxxx   ALTER COLUMN  xxxxx   SET DEFAULT '0';

  2. 学习。NET三周心得

    目前为止 学习.NET已经快一个月了,有刚开始的不懂,到中途懵懂.再到现在的简懂 ,感觉自己迷了好多天,学习程序员跟学其他的程序还不同,其他的有固定格式,而.NET则固定很少 ,一直在用方法连接前后台 ...

  3. 【csp模拟赛九】--dfs3

    这道题贪心错误:直接dfs就行,枚举新开一个还是往之前的里面塞 贪心代码(80): #include<cstdio> #include<algorithm> #include& ...

  4. 微信小程序向本地保存

    提示框: wx.showToast(OBJECT) 显示消息提示框 wx.saveImageToPhotosAlbum({ filePath : "./test.png", //这 ...

  5. 常见的时间字符串与timestamp之间的转换 时间戳

    这里说的字符串不是一般意义上的字符串,是指在读取日期类型的数据时,如果还没有及时解析字符串,它就还不是日期类型,那么此时的字符串该怎么与时间戳之间进行转换呢? ① 时间字符串转化成时间戳 将时间字符串 ...

  6. HTTP状态码和支持的方法

    1. HTTP常用状态码   200 ok 客户端请求成功 400 bad request 客户端请求有语法错误,不能被服务器所理解 401 unauthorized 请求要求身份验证,对于登录后请求 ...

  7. mapred-site.xml 基本配置参考

    说明:这是hadoop2.x版本的参数.下面的value都是参数默认值. 常用配置: ♥♥♥ .mapreduce.job.hdfs-servers value:${fs.defaultFS} 说明: ...

  8. python3编程基础之一:程序结构

    程序从程序入口进入,到程序执行结束,大体是按照顺序结构执行语句.函数或代码块,掌握程序的结构,有利于把握程序的主体框架. 1.顺序结构--最常见的结构 顺序结构的程序设计是最简单的,只要按照解决问题的 ...

  9. OpenFOAM 中的边界条件(二)【转载】

    转载链接:http://xiaopingqiu.github.io/2016/04/02/Boundary-conditions-in-OpenFOAM2/ 本篇在上一篇的基础上来解读 OpenFOA ...

  10. JDBC工具类:JDBCUtils

    1. 目的 每次使用JDBC的时候都要书写冗长的代码段,不符合复用的理念,于是要单独写一个类,将通用的JDBC操作写到一个类中,便于重复使用和精简代码. 2. 步骤 (1)注册驱动并获取连接 为了最大 ...