引言

很久之前在群里有看到说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. 如何从零开始实现TDOA技术的 UWB 精确定位系统(1)

    前言 这是一个系列文章,将向你介绍如何从零开始实现一个使用TDOA技术的 UWB 精确定位系统. 重要提示(劝退说明): Q:做这个定位系统需要基础么? A:文章不是写给小白看的,需要有电子技术和软件 ...

  2. 下载安装Android Studio

    1,安装java的jdk 2,下载安装Dart 3,下载安装  Android Studio 建议这个安装在C盘,以防后期出现各种问题 在plugins中 (1)下载dart插件 (2)下载flutt ...

  3. 六一新玩法!AI涂鸦秒变精美艺术画

    摘要:上华为云ModelArts体验AI涂鸦新玩法,赢漫威复仇者联盟乐高!祝大小朋友们六一儿童节快乐~ 本文分享自华为云社区<[云享热点]六一新玩法!AI 涂鸦秒变精美艺术画>,作者:华为 ...

  4. 设备如何使用go sdk轻松连接华为云IoT平台?

    摘要:本文介绍使用huaweicloud-iot-device-sdk-go 连接华为云IoT平台,实现简单的华为云文档介绍的四个功能:设备连接鉴权.设备命令.设备消息和设备属性. 本文分享自华为云社 ...

  5. 教你用Python 编写 Hadoop MapReduce 程序

    摘要:Hadoop Streaming 使用 MapReduce 框架,该框架可用于编写应用程序来处理海量数据. 本文分享自华为云社区<Hadoop Streaming:用 Python 编写 ...

  6. 技术+案例详解无监督学习Autoencoder

    摘要:本篇文章将分享无监督学习Autoencoder的原理知识,然后用MNIST手写数字案例进行对比实验及聚类分析. 本文分享自华为云社区<[Python人工智能] 十五.无监督学习Autoen ...

  7. 火山引擎DataTester:如何使用A/B测试优化全域营销效果

      当前,营销技术步入了全渠道.全周期的全域时代,随着广泛的数据积累,数据科学技术在营销领域发挥着越来越重要的作用,从消费者人群洞察到智能化信息广告投放,营销的提效让企业得以在转化的每个环节提升影响力 ...

  8. Solon2 开发之IoC,三、注入或手动获取 Bean

    1.如何注入Bean? 先了解一下Bean生命周期的简化版: 运行构建函数 尝试字段注入(有时同步注入,没时订阅注入.不会有相互依赖而卡住的问题) @Init 函数(是在容器初始化完成后才执行) .. ...

  9. CentOS 7上安装 Jenkins 2.227 -- yum 方式

    CentOS 7上安装 Jenkins 2.227 -- yum 方式 装插件的时候会报版本过低,建议安装 2.346 安装 Jenkins # [root@localhost ~]# ll /etc ...

  10. OLAP引擎也能实现高性能向量检索,据说QPS高于milvus!

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 随着LLM技术应用及落地,数据库需要提高向量分析以及AI支持能力,向量数据库及向量检索等能力"异军突起& ...