C#使用KingAOP实现AOP面向切面编程二
本文继续上篇讲述一下比较复杂点的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面向切面编程二的更多相关文章
- C#使用KingAOP实现AOP面向切面编程一
AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 实现AOP主要由两种方式,一种是编译时静态植入,优点是 ...
- AOP 面向切面编程, Attribute在项目中的应用
一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...
- AOP面向切面编程的四种实现
一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...
- Javascript aop(面向切面编程)之around(环绕)
Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...
- Method Swizzling和AOP(面向切面编程)实践
Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...
- [转] AOP面向切面编程
AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...
- C# AOP 面向切面编程之 调用拦截
有时候我们需要在代码中对方法调用进行拦截,并修改参数和返回值,这种操作叫做AOP(面向切面编程) 不过需要注意的是,AOP的效率很慢,在需要高效率场合慎用. 以下是C#的AOP方法: 首先建立一个控制 ...
- 【原创】Android AOP面向切面编程AspectJ
一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存
代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...
随机推荐
- 008——MATLAB-xlswrite的使用方法
(一)参考文献:https://blog.csdn.net/liangjiubujiu/article/details/80455753 以矩阵A=[1 2 3 4;5 6 7 8]为例进行介绍 例1 ...
- Spring AOP的作用,动态代理模式
AOP即面向切面编程.AOP是基于代理模式的. 代理模式: 当我们需要修改一个类,在类中加入代码时,为了不破坏这个类的封装性.可以使用代理模式,建立一个代理类. 比如:修改需求,在调用UserCont ...
- Python多线程笔记(三),queue模块
尽管在Python中可以使用各种锁和同步原语的组合编写非常传统的多线程程序,但有一种首推的编程方式要优于其他所有编程方式即将多线程程序组织为多个独立人物的集合,这些任务之间通过消息队列进行通信 que ...
- NetworkX系列教程(2)-graph生成器
小书匠Graph图论 本节主要讲解如何快速使用内置的方法生成graph,官方的文档在这里,里面包含了networkX的所有graph生成器,下面的内容只是我节选的内容,并将graph画出来而已. 声明 ...
- Codeforces 1153F Serval and Bonus Problem [积分,期望]
Codeforces 思路 去他的DP,暴力积分多好-- 首先发现\(l\)没有用,所以不管它. 然后考虑期望的线性性,可以知道答案就是 \[ \int_0^1 \left[ \sum_{i=k}^n ...
- Allure自动化测试报告之修改allure测试报告名称
1.从github获取allure代码 https://github.com/allure-framework/allure2 2.安装gradle,用于打包jar brew install grad ...
- mysql 导入导出表结构和表数据
mysqldump -u用户名 -p密码 -d 数据库名 表名 > 脚本名; 导出整个数据库结构和数据mysqldump -h localhost -uroot -p123456 databas ...
- Telegraf+Influxdb+Grafana(Windows下本机简易监控系统搭建)
1.文件名称 telegraf-1.5.0_windows_amd64.zip influxdb-1.4.2_windows_amd64.zip grafana-4.6.3.windows-x64.z ...
- Linux 系统配置IPv6
1.自动获取IPV6地址 1)修改/etc/sysconfig/network文件,修改如下字段,不存在则手动添加,部分系统默认是开启的NETWORKING_IPV6=yes 2)修改/etc/sys ...
- arcgis python 布局中所有元素信息报告
# Author: ESRI # Date: July 5, 2010 # Version: ArcGIS 10.0 # Purpose: This script generates a report ...