AspectCore 是Lemon名下的一个国产Aop框架,提供了一个全新的轻量级和模块化的Aop解决方案,下面我们就来深入了解下AspectCore在C#中的具体使用吧

 

写在前面

AspectCore 是Lemon名下的一个国产Aop框架,提供了一个全新的轻量级和模块化的Aop解决方案。面向切面也可以叫做代码拦截,分为静态和动态两种模式,AspectCore 可以实现动态代理,支持程序运行时在内存中“临时”生成 AOP 动态代理类。

老规矩从 Nuget 安装 AspectCore.Extensions.DependencyInjection 包。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using AspectCore.DynamicProxy;
  
public class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Start...");
        ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();
        using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
        {
            Person p = proxyGenerator.CreateClassProxy<Person>();
            Console.WriteLine(p.GetType().BaseType);
            p.Say($"{Environment.NewLine} Hello World!");
        }
        Console.WriteLine("End");
        Console.ReadLine();
    }
}
  
public class CustomInterceptor : AbstractInterceptorAttribute
{
    public async override Task Invoke(AspectContext context, AspectDelegate next)
    {
        try
        {
            Console.WriteLine("Before service call");
            await next(context);
        }
        catch (Exception)
        {
            Console.WriteLine("Service threw an exception!");
            throw;
        }
        finally
        {
            Console.WriteLine("After service call");
        }
    }
}
  
public class Person
{
    [CustomInterceptor]
    public virtual void Say(string msg)
    {
        Console.WriteLine("service calling..." + msg);
    }
}

调用示例

如图,代理类将Say方法包裹了起来。

如果修改一下CustomInterceptor 的Invoke方法,可以直接根据条件控制代码的分支跳转。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class CustomInterceptor : AbstractInterceptorAttribute
{
    public async override Task Invoke(AspectContext context, AspectDelegate next)
    {
        try
        {
            Console.WriteLine("Before service call");
            if (false)
                await next(context);
            else
                await Task.Delay(1000);
        }
        catch (Exception)
        {
            Console.WriteLine("Service threw an exception!");
            throw;
        }
        finally
        {
            Console.WriteLine("After service call");
        }
    }
}

运行代码 Person中的Say方法本体就被跳过了:

到此这篇关于C#面向切面编程之AspectCore用法详解的文章就介绍到这了,更多相关C# AspectCore内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

C#面向切面编程之AspectCore用法详解的更多相关文章

  1. shell编程之awk命令详解

    shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...

  2. 面向切面编程之cglib代理方式

    思想: 和上一篇面向切面编程之手动JDK代理方式上的需求和开发模式一样.不同的是目标类没有接口,只有实现类,采用的是spring中提供的Enhancer类继承目标类实现的代理方式. 需要导入的jar包 ...

  3. spring-第十六篇之AOP面向切面编程之Spring AOP

    1.上一篇介绍了AspectJ在AOP的简单应用,让我们了解到它的作用就是:开发者无需修改源代码,但又可以为这些组件的方法添加新的功能. AOP的实现可分为两类(根据AOP修改源码的时机划分): 1& ...

  4. Spring——面向切面编程(AOP)详解

    声明:本博客仅仅是一个初学者的学习记录.心得总结,其中肯定有许多错误,不具有参考价值,欢迎大佬指正,谢谢!想和我交流.一起学习.一起进步的朋友可以加我微信Liu__66666666 这是简单学习一遍之 ...

  5. spring-第十五篇之AOP面向切面编程之AspectJ框架简单应用

    1.去官方网站下载aspectj-1.8.0.jar 2.在jar包目录启动cmd,执行java -jar aspectj-1.8.0.jar,Next 3.检查JAVA_HOME路径是否正确,如果不 ...

  6. Android编程之SparseArray<E>详解

    最近编程时,发现一个针对HashMap<Integer, E>的一个提示: 翻译过来就是:用SparseArray<E>来代替会有更好性能.那我们就来看看源码中SparseAr ...

  7. Oracle数据库中序列(SEQUENCE)的用法详解

    Oracle数据库中序列(SEQUENCE)的用法详解   在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...

  8. java.util.ResourceBundle国际化用法详解

    java.util.ResourceBundle国际化用法详解 初识国际化和ResourceBundle 这个类主要用来解决国际化和本地化问题.国际化和本地化可不是两个概念,两者都是一起出现的.可以说 ...

  9. python format 用法详解

    format 用法详解 不需要理会数据类型的问题,在%方法中%s只能替代字符串类型 单个参数可以多次输出,参数顺序可以不相同 填充方式十分灵活,对齐方式十分强大 官方推荐用的方式,%方式将会在后面的版 ...

  10. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

随机推荐

  1. PVE折腾笔记 (3) 在原QNAP使用的硬盘上创建ZFS

    前言 在经过一番研究后,我决定使用ZFS作为俩机械硬盘的文件系统,本来也可以和QNAP一样直接ext4的,但ZFS比较安全,有自愈功能,可以处理比特位翻转的问题,总之就是好用. 如果追求灵活性可以使用 ...

  2. hot100之二叉树下

    二叉树的右视图(199) class Solution { List<Integer> res = new ArrayList<>(); public List<Inte ...

  3. Krpano krpanotools 命令行工具包

    PHP Krpano 工具包 集成krpanotools工具命令,不用看官方文档.即可使用的工具包几行代码搞定krpanotools搞定生涩的命令. krpano Tools (Command-Lin ...

  4. CheckSum算法--又名累加和校验算法

    校验和(Checksum)是网络协议使用的数据错误检测方法,并且被认为比LRC(纵向冗余校验,Longitudinal Redundancy Check,LRC),VRC和CRC(循环冗余校验(Cyc ...

  5. 本地代理之Charles使用

    简介Charles是一款网络监测工具,还能将线上的资源代理(偷梁换柱)成本地的资源,再有时候不方便发版或修改源代码的时候,这一招倒是挺方便的 下载与安装官网地址:www.charlesproxy.co ...

  6. Luogu P3959 [NOIP 2017 提高组] 宝藏 题解

    P3959 [NOIP2017 提高组] 宝藏 不难发现最后的路径一定会构成一棵树.由于每条路的贡献与与其深度有关,故考虑设计与深度有关的状态.由于数据范围很小,考虑状态压缩 DP,每次扩展一层. 设 ...

  7. ETL中如何自定义规则

    一.ETL中的规则 在使用规则之前我们先来了解一下什么是规则,ETL中规则在很多组件中都能看见,可以理解为按照事前约定好的逻辑去执行,规则可以使得数据更加的规范统一,同时也不需要去纵向的修改底层代码, ...

  8. 2024百度之星题解 T2跑步

    原题链接:跑步 关键词:数学.推公式.lcm.乘法逆元 算法分析:环形跑道相遇次数计算问题 一.最浅显性质分析 性质 a:跑 $ m = \text{lcm}{i|i \in [1,n]} $ 分钟. ...

  9. 达人篇:9.2)APQP产品质量先期策划

    本章目的:介绍APQP流程,明确APQP各个阶段的输入输出.理解APQP是帮助而不是负担. 1.APQP的鱼骨图 上图作者自己画的,用于整理思维.可以单独保存查看,这是张清晰的图片. 2.APQP概念 ...

  10. Windows 10 消费者\商业版本 20H2(2021年2月更新)附百x云链接

    Windows 10 消费者版本 20H2(2021年2月更新)x64 64位系统 中文简体 包含: 专业版 家庭版  教育版 专业教育版 专业工作站版 文件名:cn_windows_10_consu ...