C# 使用Emit实现动态AOP框架 (二)
目 录
实现DynamicProxy前,先介绍几个必要的辅助类:
一、切面上下文类AspectContext
该类是作为切面特性类的OnEntry和OnEixt方法的参数用的,该类包含了被代理对象Sender、当前切入的方法名称(Name)、调用方法的参数列表(Args)以及返回值(Result)
public class AspectContext
{ #region 构造函数
/// <summary>
/// 构造函数
/// </summary>
/// <param name="sender">被切入的对象</param>
/// <param name="name">切入方法名称</param>
/// <param name="args">调用参数</param>
public AspectContext(object sender, string name, object[] args)
{
Sender = sender; Name = name; Args = args; Result = null;
}
#endregion #region 属性 /// <summary>
/// 被切入的对象
/// </summary>
public object Sender { get; set; } /// <summary>
///切入方法名称
/// </summary>
public string Name { get; set; } /// <summary>
/// 方法调用参数
/// </summary>
public object[] Args { get; set; } /// <summary>
/// 返回值
/// </summary>
public object Result { get; set; } #endregion
}
二、切面特性基类 AspectAttribute
/// <summary>
/// 切面特性基类
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property)]
public abstract class AspectAttribute : Attribute
{
public AspectAttribute()
{
IntercepType = XAOP.IntercepType.All;
} public abstract InterceptType InterceptType { get; set; } public abstract void OnEntry(AspectContext context); public abstract void OnExit(AspectContext context);
}
该类作为所有切面特性的基类,包含拦截的类型、方法调用入口和方法调用出口。
三、拦截类型 InterceptType
/// <summary>
/// 拦截类型
/// </summary>
public enum InterceptType
{
#region 枚举值 /// <summary>
/// 入口
/// </summary>
OnEntry = , /// <summary>
/// 出口
/// </summary>
OnExit = , /// <summary>
/// 所有
/// </summary>
All = #endregion
}
四、日志特性类
该类简单实现了方法调用前后的日志记录功能。
/// <summary>
/// 日志特性
/// </summary>
public class LogAttribute : AspectAttribute
{
public override InterceptType InterceptType { get; set; } #region 开始调用
/// <summary>
/// 开始调用
/// </summary>
/// <param name="context"></param>
public override void OnEntry(AspectContext context)
{
Console.Write("Log OnEntry:"); if (context != null && context.Args != null)
Console.WriteLine("{0}({1})", context.Name, string.Join(",", context.Args));
}
#endregion #region 调用结束
/// <summary>
///
/// </summary>
/// <param name="context"></param>
public override void OnExit(AspectContext context)
{
Console.WriteLine("Log OnExit: " + context.Name + (context.Result != null ? " Result: " + context.Result.ToString() : "") + "\r\n");
}
#endregion
}
C# 使用Emit实现动态AOP框架 (二)的更多相关文章
- C# 使用Emit实现动态AOP框架 (三)
目 录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...
- C# 使用Emit实现动态AOP框架 (一)
目 录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...
- C# 使用Emit实现动态AOP框架 进阶篇之异常处理
目 录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...
- C# 使用Emit实现动态AOP框架 进阶篇之优化
目 录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...
- C#利用Emit反射实现AOP,以及平台化框架封装思路
C#利用Emit反射实现AOP,以及平台化框架封装思路 这是前两天扒的一段动态代理AOP代码,用的Emit反射生成子类来实现代理模式,在这里做个小笔记,然后讨论一下AOP框架的实现思路. 首先是主函数 ...
- .NET 下基于动态代理的 AOP 框架实现揭秘
.NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 https://www.cnblogs.com/weihan ...
- Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架
类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Jav ...
- JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架
1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...
- Dora.Interception,为.NET Core度身打造的AOP框架:全新的版本
Dora.Interception 1.0(Github地址:可以访问GitHub地址:https://github.com/jiangjinnan/Dora)推出有一段时间了,最近花了点时间将它升级 ...
随机推荐
- Ubuntu18.04 桌面系统的个人吐槽(主要是终端)
装了Ubuntu18.04,桌面换风格了,使用中最大的感觉是终端切换非常反人类,可能是我还没有摸清门路.原先习惯用Alt+Tab快捷键切不同终端以及不同窗口的,现在Alt+Tab时多个终端会归成一个图 ...
- ubuntu 无法访问windows使用的磁盘
安装双系统的电脑,正常情况下Ubuntu是可以访问windows下使用的磁盘的, 当出现如下图所示问题时: Windows没有正常关闭. 解决方法: sudo apt-get install ntfs ...
- Build Telemetry for Distributed Services之Open Telemetry来历
官网:https://opentelemetry.io/ github:https://github.com/open-telemetry/ Effective observability requi ...
- mongodb查询修改
//查 public StatisticsSchoolPracticeView findByUser(String userId,int statOrgType,int inDateType){ Qu ...
- iOS-static和const联合使用;使用static const 与 #define
static和const联合使用: static将一个全局变量变成局部变量 const将一个局部变量变成局部常量 // 定义了一个局部常量 static const CGFloat ...
- Flutter酷炫的路由动画效果
现在Flutter的路由效果已经非常不错了,能满足大部分App的需求,但是谁不希望自己的App更酷更炫那,下面介绍几个酷炫的路由动画. 其实路由动画的原理很简单,就是重写并继承PageRouterBu ...
- Java基础——接口和抽象类
接口(interface) 什么是接口? 接口时抽象方法的合集.接口不可以被直接被实例化. 为什么要使用接口? 为了扩展.Java不支持多继承,但是通过接口就可以实现“多继承” 制定规则.接口就是规则 ...
- openssl-1.17.0安装(centos7)
##编译环境前提,安装了gcc 和gcc-c++ ## 下载源码包prce-8.43.tar.gz tar -zxvf pcre-8.43.tar.gz ## 下载源码包openssl-1.02.ta ...
- NDK学习笔记-JNI的引用
JNI中的引用意在告知虚拟机何时回收一个JNI变量 JNI引用变量分为局部引用和全局引用 局部引用 局部引用,通过DeletLocalRef手动释放对象 原因 访问一个很大的Java对象,使用之后还用 ...
- Bootstrap 控制台示例
1.打开https://getbootstrap.com/docs/4.3/examples/ 2.选择Dashboard 3.右键查看源代码,另存为 4.通过源代码界面下载JS和CSS 5.修改绝对 ...