目  录

C# 使用Emit实现动态AOP框架 (一)

C# 使用Emit实现动态AOP框架 (二)

C# 使用Emit实现动态AOP框架 (三)

C# 使用Emit实现动态AOP框架 进阶篇之异常处理

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框架 (二)的更多相关文章

  1. C# 使用Emit实现动态AOP框架 (三)

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  2. C# 使用Emit实现动态AOP框架 (一)

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  3. C# 使用Emit实现动态AOP框架 进阶篇之异常处理

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  4. C# 使用Emit实现动态AOP框架 进阶篇之优化

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  5. C#利用Emit反射实现AOP,以及平台化框架封装思路

    C#利用Emit反射实现AOP,以及平台化框架封装思路 这是前两天扒的一段动态代理AOP代码,用的Emit反射生成子类来实现代理模式,在这里做个小笔记,然后讨论一下AOP框架的实现思路. 首先是主函数 ...

  6. .NET 下基于动态代理的 AOP 框架实现揭秘

    .NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 https://www.cnblogs.com/weihan ...

  7. Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架

    类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Jav ...

  8. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  9. Dora.Interception,为.NET Core度身打造的AOP框架:全新的版本

    Dora.Interception 1.0(Github地址:可以访问GitHub地址:https://github.com/jiangjinnan/Dora)推出有一段时间了,最近花了点时间将它升级 ...

随机推荐

  1. legend3---13、vue是真的好用

    legend3---13.vue是真的好用 一.总结 一句话总结: 下次前端所有的交互页面都可以用vue 1.chrome查看post请求携带的参数? 请求的Headers里面的Form Data里面 ...

  2. What do you do as a DevOps?

    https://ilhicas.com/2019/08/11/What-you-as-a-Devops.html Introduction In this post I'll just explain ...

  3. 北大ACM - POJ试题分类

    1.入门水题 可用于练手与增强自信 POJ-1003POJ-1004 POJ-1005 POJ-1207 POJ-3299 POJ-2159 POJ-1083POJ-3094 2.初级 2.1. 基本 ...

  4. Kotlin 中类函数

    在kotlin中函数可以在类外部定义也可以在类内部定义,前者即为全局函数,后者,是类成员函数,语法一样 package loaderman.demo class Person { fun demo(n ...

  5. numpy中flatten学习笔记

    ndarray.flatten() 用法 用于返回一个折叠成一维的数组.该函数只能适用于numpy对象,即array或者mat,普通的list列表是不行的. 例子 # coding=utf-8 fro ...

  6. kafka的学习(一)

    写在最前面,先简单讲解一些kafka的概念: 一.概念1.1 kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据.Brokerkafka集群包含一个或者多个 ...

  7. 监控查询慢sql

    mysql:--查询慢sql:业务db用户 select b.time, b.host, b.id, b.state, b.user, b.db, b.info  from information_s ...

  8. git clone https://chromium.googlesource.com/失败

    一.现象     连接着vpn,网页上可以直接打开网站,但是使用terminal 执行git clone https://chromium.googlesource.com/xxxx时,     报错 ...

  9. ElasticSearch——分页查询

    前言 ElasticSearch实现分页查询,有3种方式,他们在数据查询中各自占据着不同的优势,因此在搜索引擎的数据分页过程中,如何更好地利用各自的优势来进行数据查询是一个非常重要的过程. 传统分页( ...

  10. 每个Xcode开发者应该知道的几个使用技巧

    1.快速打开 快速打开(Open Quickly)命令在Xcode的File菜单中,当然,用快捷键Command+Shift+O会更方便一些.这个命令可以开启一个小窗格用来快速搜索浏览文件.类.算法以 ...