NCoreCoder.Aop详解

于今天,功能终于完善度到比较满意的程度了

准备好好写一篇文章,而不是之前的流水账,分享一下最近这些天的踩坑


 

一开始AOP选的微软提供的DispatchProxy

关于这个,有大佬的文章,可以看看,了解一下

https://www.cnblogs.com/ElderJames/p/implement-simple-Aop-using-a-dotnet-core-library-System-Reflection-DispatchProxy.html

初步完成后,发现几个大问题,异步不支持,不支持构造器注入,代理类必须是继承DispatchProxy的公开类

我就想到我偶像Lemon大佬的著作AspectCore了,依稀记得是Emit构建的代理类

也有代码可以参考学习,那就开干,前后四天多的时间,终于完工

下面介绍一下我的AOP组件 NCoreCoder.Aop的使用以及高级应用


 

简单的使用NCoreCoder.Aop

NCoreCoder.Aop支持依赖注入,用依赖注入的方式完成代理类和接口的关联

支持.Net Core 3.0以及以下的依赖注入方式

示例

    public interface IMyClass{void TestVoid();int TestInt();Task TestAsync();Task<int> TestIntAsync();}[JitInject]internal class MyClass : IMyClass{public void TestVoid(){Console.WriteLine("TestVoid");}public int TestInt(){Console.WriteLine("TestInt");return 100;}public Task TestAsync(){Console.WriteLine("TestAsync");return Task.CompletedTask;}public Task<int> TestIntAsync(){Console.WriteLine("TestIntAsync");return Task.FromResult(100);}}

打上JitInject特性是证明这个类需要实现代理

这里就只是构建代理类,没有方法并走代理流程,代理支持 同步API、异步无返回值API、异步有返回值API

要拦截的方法,默认是继承JitAopAttribute,打特性方式完成拦截器注入

打在继承的实现类上

比如

    [AttributeUsage(AttributeTargets.Method)]internal class TestJitAttribute : JitAopAttribute{public override void Before(MethodReflector method, object instance, params object[] param){}public override void After(MethodReflector method, object instance, params object[] param){}public override Task BeforeAsync(MethodReflector method, object instance, params object[] param){return Task.CompletedTask;}public override Task AfterAsync(MethodReflector method, object instance, params object[] param){return Task.CompletedTask;}}

在需要拦截的方法上,打上TestJit即可

        [TestJit]public void TestVoid(){Console.WriteLine("TestVoid");}public int TestInt(){Console.WriteLine("TestInt");return 100;}public Task TestAsync(){Console.WriteLine("TestAsync");return Task.CompletedTask;}public Task<int> TestIntAsync(){Console.WriteLine("TestIntAsync");return Task.FromResult(100);}}

这样TestVoid方法就要走AOP流程了

Asp.Net Core 3.0以下

因为Asp.Net Core 3.0以下的Startup.ConfigService方法支持直接修改返回值变成IServiceProvider

所以在Asp.Net Core 3.0以下,依赖注入都是在Startup.ConfigService里面修改IServiceProvider到自定义的IServiceProvider完成替换依赖注入容器和流程的效果,比如Autofac

        public void ConfigureServices(IServiceCollection services){services.AddMvc();//略略略}

改为

        public IServiceProvider ConfigureServices(IServiceCollection services){services.AddMvc();//略略略service.AddSingleton<IMyClass, MyClass>();//修改Ioc容器流程return service.BuilderJit();}

Asp.Net Core 3.0

Asp.Net Core 3.0的替换依赖注入流程变了

无法再修改Startup.ConfigService返回值了,只要不是void,运行就抛出异常

查看的Program.CreateHostBuilder

        public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});

改为

        public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).UseServiceProviderFactory(new JitServiceProviderFactory()) //新增.ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});

这里可以保持原有依赖注入,也可以增加一个方法

        public void ConfigureContainer(JitAopBuilder builder){builder.Add<IMyClass, MyClass>(ServiceLifetime.Singleton);}

测试Aop

            var service = new ServiceCollection();service.AddSingleton<IMyClass, MyClass>();var serviceProvider = service.BuilderJit();TypeBuilderFactory.Instance.Save();var myclass = serviceProvider.GetRequiredService<IMyClass>();Task.Factory.StartNew(async () =>{myclass.TestVoid();var result1 = myclass.TestInt();await myclass.TestAsync();var result2 = await myclass.TestIntAsync();});Console.ReadLine();

我们运行看看myclass对象是什么~

 

不是原有的MyClass对象


高级扩展

我们现在如果要针对不同流程,而不是默认的Before->After

那么我们就需要自定义一个IAopActors了

我们默认的JitAopAttribute的流程就是一个默认DefaultAopActors

 

编写一个公开的类,继承自IAopActors

IAopActors接口如下

 

然后再接口上打上特性AopActorsAttribute

特性的构造参数是Type对应了自定义的AopActors的Type

    public class TestActors : IAopActors{public object Execute(AopContext context){throw new NotImplementedException();}public Task<TResult> ExecuteAsync<TResult>(AopContext context){throw new NotImplementedException();}public Task InvokeAsync(AopContext context){throw new NotImplementedException();}}
    [AopActors(typeof(TestActors))]public interface IMyClass{void TestVoid();int TestInt();Task TestAsync();Task<int> TestIntAsync();}

个人文笔不好,如有疑问,可以加“.Net应用程序框架交流” 群号386092459 欢迎到群里和我反馈Bug或者建议、交流Aop设计和Emit的知识

转载于:https://www.cnblogs.com/NCoreCoder/p/11597788.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

主类网络号怎么算_一文了解网络文化经营许可证的审批范围

3月10日&#xff0c;北京市文化和旅游局发布《关于电商类、教育类、医疗类、培训类、金融类、旅游类、美食类、体育类、聊天类不需要申请办理的特别提示》(以下简称《特别提示》)。《特别提示》指出&#xff0c;随着互联网技术的快速发展&#xff0c;利用互联网从事文化经营活动…

idea命令行运行多个客户端_推荐一款神仙颜值的 Redis 客户端工具,开源啦

日常开发过程中&#xff0c;项目常常都会使用Redis来做缓存或者Session服务器&#xff0c;为了更直观方便&#xff0c;开发者常常会使用一些可视化工具&#xff0c;如 Redis Desktop Manager、Redis Clent等&#xff0c;但界面UI做得不尽人意&#xff0c;作为当今时代&#xff…

javascript二维数组转置_精通Excel数组公式010:认识数组函数:TRANSPOSE、MODE.MULT和TREND...

学习Excel技术&#xff0c;关注微信公众号&#xff1a;excelperfect数组函数是可以提供多个值的Excel内置函数。下面列出了8个Excel内置的数组函数&#xff1a;TRANSPOSE函数MODE.MULT函数(在Excel 2010中引入)TREND函数FREQUENCY函数LINEST函数MMULT函数MUNIT函数(在Excel 201…

linux python安装教程_Linux系统如何安装Python?新手教程

新手入门Python的第一步就是要在你的计算机上安装好Python。有些人可能要问了&#xff0c;Linux系统如何安装Python&#xff1f;本文为你准备了一份新手安装Python的教程&#xff0c;几乎是手把手教你如何操作&#xff0c;你只要尽量照着下面的教程说明&#xff0c;就能成功地在…

1-6docker数据共享与持久化

1、在 Docker 内部以及容器之间管理数据&#xff0c;在容器中管理数据主要有两种⽅式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09; 挂载主机⽬录 (Bind mounts)2、数据卷 数据卷 是⼀个可供⼀个或多个容器使⽤的特殊⽬录&#xff0c;它绕过 UFS &#xff0c;可以提…

中yeti不能加载_第二十章_类的加载过程详解

类的加载过程详解概述在 Java 中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义&#xff0c;引用数据类型则需要进行类的加载按照 Java 虚拟机规范&#xff0c;从 Class 文件到加载到内存中的类&#xff0c;到类卸载出内存位置&#xff0c;它的整个生命…

泛型参数怎么new_泛型编程,你不知道?(基础篇)

关注“杜明c”&#xff0c;每天进步一点点&#xff01;我们学习C&#xff0c;就常常有人提起泛型编程&#xff0c;什么是泛型编程&#xff1f;我就给大家简单聊一聊。摘要-什么是泛型编程为什么使用泛型编程使用方法什么是泛型编程泛型编程&#xff0c;简而言之&#xff0c;就是…

zabbix入门之添加监控项

zabbix入门之添加监控项 添加一个不带参数的监控项&#xff08;system.cpu.switches&#xff09; 进入“配置”-->“主机”选择某主机的“监控项” 选择创建监控项 键值后边的“选择”提供了大量的键值&#xff0c;带有[ ]的需要定义参数值&#xff0c;这里选择system.cpu.s…

scratch跳一跳游戏脚本_cocos creator制作微信小游戏「跳一跳」

一、游戏的分析(之前没有接触过小游戏&#xff0c;制作的思维还停留在大型ARPG游戏大家共同协作的想法里&#xff0c;但是小游戏讲究小而全&#xff0c;大部分时间是一个人独立开发&#xff0c;所以需要迫使自己养成看到小游戏先拆分细化的思想)二、一些必要的参数台阶参数1: 设…

中boxplot函数的参数设置_如何在Python中生成图形和图表

在本章中&#xff0c;我们将学习如何在Python中生成图形和图表&#xff0c;同时将使用函数和面向对象的方法来可视化数据。Python中常用的一些可视化数据包括以下几种。Matplotlib。Seaborn。ggplot。Geoplotlib。Bokeh。Plotly。在本章中将使用Matplotlib可视化数据包。此外&a…

zabbix入门之监控MySQL

zabbix入门之监控MySQL 这里使用的是zabbix官方自带的MySQL监控模板。 首先确保在被监控主机安装zabbix-agent、zabbix-sender&#xff0c;并且将主机加入监控节点。具体操作请看zabbix添加主机&#xff1a;https://www.cnblogs.com/Smbands/p/11593593.html 修改zabbix自带的M…

css清除浮动的几种方法_CSS 分享几种传统布局方法[上]

本章主要探讨 HTML5 中 CSS 早期所使用的传统布局&#xff0c;很多情况下&#xff0c;这些布局方式还是非常有用的。一&#xff0e;布局模型在早期没有平板和智能手机等移动设备大行其道的时期&#xff0c;Web 页面的设计主要是面向PC 端电脑分辨率展开的。这种分辨率比例比较单…

1-7docke的网络模式

1、Bridge模式bridge 模式是 docker 的默认⽹络模式&#xff0c;不写 –net 参数&#xff0c;就是 bridge 模式。比如使⽤ docker run - p 时工作模式从网上找了一个&#xff0c;如下 例子&#xff1a; run -it -d --name test1 --netbridge centos:v1 bashrun -it -d --name t…

分页的limit_分页场景(limit,offset)为什么会慢

链接:http://t.cn/AidABz08从一个问题说起五年前在腾讯的时候&#xff0c;发现分页场景下&#xff0c;mysql请求速度非常慢。数据量只有10w的情况下&#xff0c;select xx from 单机大概2&#xff0c;3秒。我就问我师父为什么&#xff0c;他反问“索引场景&#xff0c;mysql中获…

Android游戏开发基础part3--Paint 画笔

游戏开发基础part3--Paint 画笔 Paint画笔是绘图的辅助类&#xff0c;一般它是作为画布的参数来实现相应的效果&#xff0c;Paint类中包含文字与位图的样式、颜色等属性信息。Paint的常用方法如下&#xff1a; 1.setAntiAlias(boolean aa) 作用&#xff1a;设置画笔是否无锯齿 …

jvm 参数_6个提高性能的JVM参数

截止到2020年五月&#xff0c;JVM中仅仅只是关于垃圾回收和内存相关的参数就已经超过600个。如果算上其他方面的参数&#xff0c;JVM相关的总参数能轻松超过1000个。参数太多了&#xff0c;弄得人很懵逼。在这边文章中&#xff0c;我们只选取了7个比较重要&#xff0c;且有用的…

zabbix入门之定义触发器

zabbix入门之定义触发器 触发器的概念 触发器的定义&#xff1a;界定某特定的item 采集到数据的非合理区间或非合理状态。通常为逻辑表达式。 逻辑表达式(阈值)&#xff1a;通常用于定义数据的不合理区间&#xff0c;其结果如下&#xff1a; O K &#xff08;符合条件&#xff…

mybatis字符串转成数字_Python字符串三种格式化输出

字符串格式化输出是python非常重要的基础语法&#xff0c;今天就把三种格式化输出做一个简单的总结&#xff0c;希望对大家有帮助。格式化输出&#xff1a;内容按照一定格式要求进行输出。1.使用占位符%输出python2.6版本之前&#xff0c;使用%格式化字符串沿用的是C语言的输出…

eclipse dorado plugin

http://lindows.iteye.com/blog/224004 下载中心 http://www.bstek.com/downloadcenter.htm dorado debug shutcut page time:CtrlShiftF12 bstekIDE Eclipse插件扩展点应用介绍 http://macrochen.iteye.com/blog/138625 BstekIDE_1.2.2_Installer.jar http://www.bstek.com/do…

三个不等_2道真题,讲透「基本不等式」的使用原则 | 真题精讲-11

「不等式」和「最值」之间有着非常天然的强联系&#xff1b;基本不等式有3个非常明显的形式特征&#xff1b;知识点的用法比知识点本身更重要。先发福利&#xff1a;这里有6场「高考数学」系列Live的讲义&#xff0c;全拿去&#xff0c;送给你——《高考数学&#xff1a;免费送…