博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
带你学习AOP框架之Aspect.Core[1]
阅读量:4317 次
发布时间:2019-06-06

本文共 3107 字,大约阅读时间需要 10 分钟。

  在软件业,AOP为Aspect Oriented Programming的缩写,意为:,通过方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是的延续,是软件开发中的一个热点,是的一种衍生范型。利用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
(); 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
(); 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
(); 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,成功。

转载于:https://www.cnblogs.com/ZaraNet/p/10308706.html

你可能感兴趣的文章
android 生命周期
查看>>
jquery--this
查看>>
MySQL 5.1参考手册
查看>>
TensorFlow安装流程(GPU加速)
查看>>
OpenStack的容器服务体验
查看>>
BZOJ 1066 蜥蜴(网络流)
查看>>
提高批量插入数据的方法
查看>>
Linux重启Mysql命令
查看>>
前端模块化:RequireJS(转)
查看>>
应用程序缓存的应用(摘抄)
查看>>
jQuery基础知识,很赞的!!!
查看>>
[Codevs] 线段树练习5
查看>>
Amazon
查看>>
component-based scene model
查看>>
Echart输出图形
查看>>
hMailServer搭建简单邮件系统
查看>>
从零开始学习jQuery
查看>>
Spring+SpringMVC+MyBatis深入学习及搭建(四)——MyBatis输入映射与输出映射
查看>>
opacity半透明兼容ie8。。。。ie8半透明
查看>>
CDOJ_24 八球胜负
查看>>