【特别的骚气】asp.net core运行时注入服务,实现类库热插拔
引言
很久之前在群里有看到说asp.net core能不能在运行时注入程序,当时并没有太在意,刚才在某个群里又看到有人再问,core能不能在运行时注入服务,闲来无事,我就研究了一下,其实也比较简单,在之前手写IOC的文章中,我们着重介绍了几个比较重要的接口,这里我们就需要用到那篇文章说到的接口,不明白的同学,传送门在此:Asp.net core自定义依赖注入容器,替换自带容器 - 四处观察 - 博客园 (cnblogs.com)。
IServiceProvider
在这里我们只需要用到这个接口,这个接口有一个GetService的一个方法,我们在创建对象的时候获取对象构造函数依赖的时候可以直接调用这个方法获取参数的对象,那我们都知道这个是IOC容器服务提供者,那它内部肯定是有一个字段或者属性,来存放我们注入或者是系统内部注入的类型的容器,不管是list或者数组,总之肯定是有这么一个东西存在的,所以我在反射的时候发现了在其实现类ServiceProvider中,有一个名为_realizedServices的字段,存放着我们所有注入的服务,看源码我们发现这个字段是一个ConcurrentDictionary类型的一个对象,其中第一个参数为我们注入的对象的类型,第二个参数实际上是一个创建这个Type的一个Func方法,传入的那个ServiceProviderEngineScope方法内部也有一个GetService方法,这样我们传入这个委托的时候,其方法内部我们可以从容器获取我们创建对象的参数,前提是你在运行时注入了你所依赖的参数,否则,肯定是会报错的。


重头戏
在上面看完源码之后,我相信很多同学肯定知道怎么做实现运行时的一个动态注入了,首先我们肯定是需要依赖IServiceProvider接口的实例的,所以我们动态注入的构造函数中肯定需要有这个参数,其次就是我们去GetType,然后GetField,然后在获取到这个Field的具体的对象,然后我们找到ConcurrentDictionary的GetOrAdd方法或者TryAdd,这里我用的是GetOrAdd方法,然后调用,传入对应的参数,就可以完成运行时的动态注入了,可以看到,我们在WeatherForecast接口构造函数中注入了我们依赖的Testdss类型的对象,然后我们构造了一个Func直接添加到了_realizedServices字段中,在第二张图中,我们在构造函数传入了一个IServiceScopeFactory参数去创建一个Scope然后去获取我们注入的Testdss的对象,测试了一下,是没有问题的,同时我在第一次测试的时候是直接传入了Testdss类型的对象进行测试的,也是没有问题的,所以不管是Scope类型的获取或者直接依赖也是没有问题的。


问题
聪明的同学,肯定知道这个其实是存在一个问题的,那就是在默认的注入中,我们对类型的生命周期是可以把控的,可以注入我们需要的单例,或者作用域,在或者是瞬时,但是在这个案例中,我们是没有对这个运行时注入的Testdss做生命周期处理的,其实这个处理起来也简单,我们可以自定定义几个特性,用来标识是单例还是瞬时还是作用域,标记在动态注入的类上,然后在控制动态注入的类中,我们定义容器来存放我们注入的对象,然后在获取的时候,根据类型创建好对象之后,如果是单例的是怎么的逻辑处理,如果是瞬时的又怎么处理,作用域的又怎么处理就行了,就可以实现运行时注入的生命周期的把控。
结语
好了,今天的分享就到此为止了,我是四川观察,喜欢研究这等骚操作,喜欢帮助大家解决问题,欢迎大家骚扰,可以在所在的QQ群中查看有没有叫四川观察的,那就是我;也可以加QQ群6406277,也可以找到我。

【特别的骚气】asp.net core运行时注入服务,实现类库热插拔的更多相关文章
- 在Linux安装ASP.NET Core运行时环境
我使用的是Centos7 ,其它的Linux请参考微软文档 微软官方介绍文档: https://www.microsoft.com/n ...
- asp.net core 系列 4 注入服务的生存期
一.服务的生存期 在容器中每个注册的服务,根据程序应用需求都可以选择合适的服务生存期,ASP.NET Core 服务有三种生存期配置: (1) Transient:暂时生存期,在每次请求时被创建. 这 ...
- ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)
ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件) Startup Class 1.Startup Constructor(构造函数) 2.Configure ...
- ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行
ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行 核心框架 ASP.NET Core APP 创建与运行 总结 之前两篇文章简析.NET Core 以及与 .NET Framew ...
- ASP.NET Core 运行原理解剖[1]:Hosting
ASP.NET Core 是新一代的 ASP.NET,第一次出现时代号为 ASP.NET vNext,后来命名为ASP.NET 5,随着它的完善与成熟,最终命名为 ASP.NET Core,表明它不是 ...
- ASP.NET Core 运行原理解剖[2]:Hosting补充之配置介绍
在上一章中,我们介绍了 ASP.NET Core 的启动过程,主要是对 WebHost 源码的探索.而本文则是对上文的一个补充,更加偏向于实战,详细的介绍一下我们在实际开发中需要对 Hosting 做 ...
- ASP.NET Core 运行原理解剖[3]:Middleware-请求管道的构成
在 ASP.NET 中,我们知道,它有一个面向切面的请求管道,有19个主要的事件构成,能够让我们进行灵活的扩展.通常是在 web.config 中通过注册 HttpModule 来实现对请求管道事件监 ...
- ASP.NET Core 运行原理解剖[4]:进入HttpContext的世界
HttpContext是ASP.NET中的核心对象,每一个请求都会创建一个对应的HttpContext对象,我们的应用程序便是通过HttpContext对象来获取请求信息,最终生成响应,写回到Http ...
- ASP.NET Core 运行原理解剖[5]:Authentication
在现代应用程序中,认证已不再是简单的将用户凭证保存在浏览器中,而要适应多种场景,如App,WebAPI,第三方登录等等.在 ASP.NET 4.x 时代的Windows认证和Forms认证已无法满足现 ...
- ASP.NET Core 运行原理剖析
1. ASP.NET Core 运行原理剖析 1.1. 概述 1.2. 文件配置 1.2.1. Starup文件配置 Configure ConfigureServices 1.2.2. appset ...
随机推荐
- 为什么说UUID是唯一的?
在数字时代,我们需要一种能够唯一标识各种实体的方法.通用唯一标识符(UUID)正是为满足这一需求而诞生的.本文将从多个方面介绍UUID,探讨它为何成为通用唯一标识符,以及为什么说UUID是唯一的. U ...
- 计算机网络分层结构--OSI模型、TCP/IP 模型、五层模型
计算机网络分层结构 OSI参考模型与TCP/IP参考模型 五层参考模型
- 2021-01-25:redis中,哨兵如何选举?
福哥答案2021-01-25: 答案1: redis-sentinel故障转移的流程: 1.当多个sentinel发现并确认了master有问题. 2.接着会选举出一个sentinel作为领导. 3. ...
- 22、Scaffold属性 抽屉菜单Drawer
在Scaffold组件里面传入drawer参数可以定义左侧边栏,传入endDrawer可以定义右侧边栏.侧边栏默 认是隐藏的,我们可以通过手指滑动显示侧边栏,也可以通过点击按钮显示侧边栏. class ...
- LeetCode 分治篇(50、17)
50. Pow(x, n) 实现 pow(x, n) ,即计算 x 的 n 次幂函数. 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, ...
- 开源的代名词「GitHub 热点速览」
当开发者谈论开源时,通常会想到 GitHub,它不仅仅是一个代码托管平台,更是一个汇聚了全球开发者的社交中心.过去,开发者发布一款软件后,都是在自己的小圈子里默默努力和交流,现在通过 GitHub 平 ...
- linux_文本处理工具详细介绍
文本处理工具 1. grep工具 grep是行过滤工具:用于根据关键字进行行过滤 语法和选项 语法: # grep [选项] '关键字' 文件名 常见选项: OPTIONS: -i: 不区分大小写 - ...
- 云图说丨云数据库GaussDB(for MySQL)事务拆分大揭秘
摘要:数据库代理提供事务拆分的功能,能够将事务内写操作之前的读请求转发到只读节点,降低主节点负载. 本文分享自华为云社区<[云图说]第270期 云数据库GaussDB(for MySQL)事务拆 ...
- iOS代码混淆-从入门到放弃
iOS代码混淆-从入门到放弃 目录 1. 什么是iOS代码混淆? 2. iOS自动代码混淆的方法是什么? 3. iOS代码混淆的作用是什么? 4. 怎么样才能做到更好的iOS代码混淆? 总结 参考 ...
- Python 太难懂?火山引擎数智平台这款产品可以了解一下!
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 「自学 Python?一般人我还是劝你算了吧!」 在国内知识分享平台「知乎」上,这一吐槽话题获得了超过 260 ...