在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

  在.NET Core中比较好的AOP框架有一个叫做Aspect的这样的一个框架, 它是一个国产的!如何引入AspectCore? 可以直接nuget。

这AspectCore中需要创建一个拦截器一般继承自 AbstractInterceptorAttribute。并且实现它的 Invoke 方法 。

其中第一个参数是上下文,next是执行的委托方法,通过这个委托可以执行被拦截的方法。

//每个被拦截的方法中执行
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方法是虚方法且被标记,也必须使用MVC中的Filter命名规范)。这个方法也可以是异步的!

public class Person
{
[CustomInterceptor]
public virtual void Say(string msg)
{
Console.WriteLine("service calling..."+msg);
}
}

如何进行代理? 需要通过ProxyGeneratorBuilder 来代理对象,注意 p 指向的对象是 AspectCore 生成的 Person 的动态子类的对象,直接 new Person是无法被拦截的。

static void Main(string[] args)
{
ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();
using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
{
Person p = proxyGenerator.CreateClassProxy<Person>();
p.Say("zaranet");
}
}

上面说到我们不可以直接new这个person,那现在我们调试一下,一探究竟!!!我们看看这个p是个什么类型。

噫?为什么这个p不是AspectPollyIdn.Person?而是AspectCore.DynamicGenerated.Person?不妨把这个p的父类给打印出来,来瞅瞅。

static void Main(string[] args)
{
ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();
using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
{
Person p = proxyGenerator.CreateClassProxy<Person>();
Console.WriteLine(p.GetType().BaseType);
p.Say("zaranet");
}
}

现在的对象是我们了,也就是它的父类,那这个时候你就绝对要明白了,为什么我们的被代理类是虚方法,也就是说它用子类类重写了我们被代理类的虚方法,也就实现了AOP,那么呢这也就是Aspect.Core的原理。大概简单的就是这样。

现在你已经了解了AspectCore的原理了,但回头发现每次来创建这些对象都非常繁琐,我们只想去使用AspectCore通过CreateClassProxy()来创建我们想要的代理对象,那么现在我们可以使用AspNetCore的依赖注入解决这个问题。

首先呢,我们引用AspectCore.Extensions.DependencyInjection,这是AspectCore给我们的一个DI框架。再把Startup中的ConfigureServices进行改造。

 public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddSingleton<Person>();
return services.BuildAspectInjectorProvider();
}

随便创建一个类 继承与AbstractInterceptorAttribute ,重写方法,再添加一个Person。

public class Person
{
[CustomInterceptor]
public virtual void Say(string msg)
{
//
}
}

在API中重载进行依赖注入。下面我们进行postman进行测试,因为已经关闭了浏览器浏览。

private Person p;
public ValuesController(Person p)
{
this.p = p;
}

OK,成功。

带你学习AOP框架之Aspect.Core[1]的更多相关文章

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

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

  2. (6)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- AOP框架

    AOP 框架基础 要求懂的知识:AOP.Filter.反射(Attribute). 如果直接使用 Polly,那么就会造成业务代码中混杂大量的业务无关代码.我们使用 AOP (如果不了解 AOP,请自 ...

  3. 跟着刚哥学习Spring框架--AOP(五)

    AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入 ...

  4. 深入浅出学习Spring框架(四):IoC和AOP的应用——事务配置

    在前文 深入浅出学习Spring框架(一):通过Demo阐述IoC和DI的优势所在. 深入浅出学习Spring框架(三):AOP 详解 分别介绍了Spring的核心功能——IoC和AOP,光讲知识远远 ...

  5. Dora.Interception: 一个为.NET Core度身定制的AOP框架

    多年从事框架设计开发使我有了一种强迫症,那就是见不得一个应用里频繁地出现重复的代码.之前经常Review别人的代码,一看到这样的程序,我就会想如何将这些重复的代码写在一个地方,然后采用“注入”的方式将 ...

  6. NET Core度身定制的AOP框架

    NET Core度身定制的AOP框架 多年从事框架设计开发使我有了一种强迫症,那就是见不得一个应用里频繁地出现重复的代码.之前经常Review别人的代码,一看到这样的程序,我就会想如何将这些重复的代码 ...

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

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

  8. Dora.Interception, 一个为.NET Core度身打造的AOP框架:不一样的Interceptor定义方式

    相较于社区其他主流的AOP框架,Dora.Interception在Interceptor提供了完全不同的编程方式.我们并没有为Interceptor定义一个接口,正是因为不需要实现一个预定义的接口, ...

  9. Dora.Interception, 一个为.NET Core度身打造的AOP框架[3]:Interceptor的注册

    在<不一样的Interceptor>中我们着重介绍了Dora.Interception中最为核心的对象Interceptor,以及定义Interceptor类型的一些约定.由于Interc ...

随机推荐

  1. java-随机生成用户名(中文版及英文版)

    开发中遇到用户名随机生成的问题,总结了两个(中文版和英文版),相关方法在此,方便直接调用. 如下: //自动生成名字(中文) public static String getRandomJianHan ...

  2. UML小白入门基础教程

    面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是Unified Modeling Language™,统一建模语言),这篇课程的目的 ...

  3. 给你的网页添加一个随机的BGM

    大晚上的,突然想到,我这么喜欢听歌的人,博客里怎么能少了BGM呢,说干就干. 首先,给博客侧边栏加一个空div:<div id="music"></div> ...

  4. add two nums

    问题描述: 给定两个链表,计算出链表对应位置相加的和,如果和大于10要往后进位.用链表返回结果.其实上是一种大数加法.可以把一个大数倒着写存入链表,然后两个链表相加就是所需要的大数相加的和 输入 2 ...

  5. Java基础:Java的四种引用

    在Java基础:java虚拟机(JVM)中,我们提到了Java的四种引用.包括:强引用,软引用,弱引用,虚引用.这篇博客将详细的讲解一下这四种引用. 1. 强引用 2. 软引用 3. 弱引用 4. 虚 ...

  6. 从CSDN到cnblogs

    博客热的年代,我也赶潮流,开了不少,以前的blogbus博客大巴,CSDN,以及MSN space,再到新浪博客,微博... 提笔写的热情越来越少,这次准备重新整理以前在CSTQB.业界分享的一些内容 ...

  7. cmd登录远程Oracle数据库

    在cmd中输入  user/password@Ip:port/sid    例如:  laoda/123@192.168.4.161:1521/orcl      laoda是用户名,123是密码.

  8. 【转】tomcat logs 目录下各日志文件的含义

    tomcat每次启动时,自动在logs目录下生产以下日志文件,按照日期自动备份   localhost.2016-07-05.txt   //经常用到的文件之一 ,程序异常没有被捕获的时候抛出的地方 ...

  9. Oracle-06:DML语言数据表的操作

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 开篇放上一个SQL脚本,供测试使用 create table DEPT ( deptno ) not null ...

  10. Debian虚拟机安装VirtualBox增强功能

    作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=573 本文中使用的Debian是安装在VirtualBox中的虚拟机,具体参数如下: Debian版本:Linux de ...