引言

很久之前在群里有看到说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运行时注入服务,实现类库热插拔的更多相关文章

  1. 在Linux安装ASP.NET Core运行时环境

    我使用的是Centos7 ,其它的Linux请参考微软文档   微软官方介绍文档:                                https://www.microsoft.com/n ...

  2. asp.net core 系列 4 注入服务的生存期

    一.服务的生存期 在容器中每个注册的服务,根据程序应用需求都可以选择合适的服务生存期,ASP.NET Core 服务有三种生存期配置: (1) Transient:暂时生存期,在每次请求时被创建. 这 ...

  3. ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)

    ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件) Startup Class 1.Startup Constructor(构造函数) 2.Configure ...

  4. ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行

    ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行 核心框架 ASP.NET Core APP 创建与运行 总结 之前两篇文章简析.NET Core 以及与 .NET Framew ...

  5. ASP.NET Core 运行原理解剖[1]:Hosting

    ASP.NET Core 是新一代的 ASP.NET,第一次出现时代号为 ASP.NET vNext,后来命名为ASP.NET 5,随着它的完善与成熟,最终命名为 ASP.NET Core,表明它不是 ...

  6. ASP.NET Core 运行原理解剖[2]:Hosting补充之配置介绍

    在上一章中,我们介绍了 ASP.NET Core 的启动过程,主要是对 WebHost 源码的探索.而本文则是对上文的一个补充,更加偏向于实战,详细的介绍一下我们在实际开发中需要对 Hosting 做 ...

  7. ASP.NET Core 运行原理解剖[3]:Middleware-请求管道的构成

    在 ASP.NET 中,我们知道,它有一个面向切面的请求管道,有19个主要的事件构成,能够让我们进行灵活的扩展.通常是在 web.config 中通过注册 HttpModule 来实现对请求管道事件监 ...

  8. ASP.NET Core 运行原理解剖[4]:进入HttpContext的世界

    HttpContext是ASP.NET中的核心对象,每一个请求都会创建一个对应的HttpContext对象,我们的应用程序便是通过HttpContext对象来获取请求信息,最终生成响应,写回到Http ...

  9. ASP.NET Core 运行原理解剖[5]:Authentication

    在现代应用程序中,认证已不再是简单的将用户凭证保存在浏览器中,而要适应多种场景,如App,WebAPI,第三方登录等等.在 ASP.NET 4.x 时代的Windows认证和Forms认证已无法满足现 ...

  10. ASP.NET Core 运行原理剖析

    1. ASP.NET Core 运行原理剖析 1.1. 概述 1.2. 文件配置 1.2.1. Starup文件配置 Configure ConfigureServices 1.2.2. appset ...

随机推荐

  1. MinIO客户端之share

    MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc share mc share download mc share upload 生成下载对象的URL,指定对 ...

  2. 使用推测解码 (Speculative Decoding) 使 Whisper 实现 2 倍的推理加速

    Open AI 推出的 Whisper 是一个通用语音转录模型,在各种基准和音频条件下都取得了非常棒的结果.最新的 large-v3 模型登顶了 OpenASR 排行榜,被评为最佳的开源英语语音转录模 ...

  3. JavaImprove--Lesson03--String的工具类,Math,Runtime,BigDecimal,Date

    一String的工具类 String的作为字符串对象,也是使用最多的数据类型对象 所以难免有很多操作,字符串的常见操作包括:字符串拼接,字符串反转,字符串长度,字符串转换等 直接使用String类型来 ...

  4. video标签视频指定帧作为预览图

    <video :src="videoUrl" :poster=" videoUrl + '?x-oss-process=video/snapshot,t_0,f_j ...

  5. MySQL篇:bug2_ Navicate无法添加或更新子行-外键约束失败

    问题产生原因 Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构. 解决办法 解决方法是在Mysql中取消外键约束: SET FOREIGN_KEY_CHECKS=0; 再添加值, 然 ...

  6. 三大基础方案和AI出海计划重磅发布!加速盘古大模型生态发展

    本文分享自华为云社区<三大基础方案和AI出海计划重磅发布!加速盘古大模型生态发展>,作者: 华为云头条. 近日,以"开放同飞,共赢行业AI新时代"为主题的华为云盘古大模 ...

  7. 保姆级带你深入阅读NAS-BERT

    摘要:本文用权重共享的one-shot的NAS方式对BERT做NAS搜索. 本文分享自华为云社区<[NAS论文][Transformer][预训练模型]精读NAS-BERT>,作者:苏道 ...

  8. vue2升级vue3:vue3 hooks库选用

    之前a-hooks:https://ahooks.js.org/,比react-use 精简好用.但是没有vue版本的. 网上有个人实现的:https://github.com/dewfall123/ ...

  9. 通用漏洞评分系统 (CVSS)系统入门指南

    通用漏洞评分系统 (CVSS) 是一个公共框架 ,用于评估软件中安全漏洞的严重性.这是一个中立的评分系统,让所有企业能够使用相同的评分框架对各种软件产品(从操作系统.数据库再到 Web 应用程序)的 ...

  10. Cypress系列(1)-Window下安装Cypress并打开

    Cypress系列(1)-Window下安装Cypress并打开 系统要求 Cypress是一个被安装在你电脑上的桌面应用,你的操作系统需要满足如下条件才能正常安装 Mac OS 10.9+(仅提供6 ...