DependencyInjection GetService方法流程概述(c#,asp.net core,.net,DI,IOC)

DependencyInjection使用

public static void Main(string[] args){
  IServiceCollection services = new ServiceCollection();
  services.Add(ServiceDescriptor.Singleton(typeof(Test<>)));
  var serviceFactory = new DefaultServiceProviderFactory();
  IServiceProvider serviceProvider = 
    								serviceFactory.CreateServiceProvider(services);
  var demo1 = serviceProvider.GetService<Test<DemoOne>>();
}

使用DependencyInjection的步骤

  • 注册服务并创建服务提供者

    • 创建 IServiceCollection

    • 向IServiceCollection中注册所有的服务

    • 使用IServiceProviderFactory实现类创建 构建服务助手(TContainerBuilder)

    • 使用 构建服务助手 创建IServiceProvider

    【注意:DefaultServiceProviderFactory是IServiceProviderFactory的默认实现,构建服务助手的默认是IServiceCollection 】

  • 从服务提供者中获取服务

    • 调用GetService方法即可

注册服务并创建服务提供者

1.创建服务集成器以及添加需要注册的所有服务

可直接看下面代码

在这里插入图片描述

不对创建服务集成器(serviceCollection)以及serviceCollection的Add方法做过多介绍。

想要了解更多关于服务注册方式可看扩展包Microsoft.Extensions.DependencyInjection.Abstractions中:

  • ServiceCollectionServiceExtensions
  • ServiceCollectionServiceExtensions.key

2.创建ServiceProvider构建助手

可以先看一下IServiceProviderFactory接口代码

public interface IServiceProviderFactory<TContainerBuilder> where TContainerBuilder : notnull{
  TContainerBuilder CreateBuilder(IServiceCollection services);
  IServiceProvider CreateServiceProvider(TContainerBuilder containerBuilder);
}

只有两个方法,单从名称上看,可以猜到CreateBuilder方法就是使用服务集成器(ServiceCollection)来创建ServiceProvider的构建助手TContainerBuilder,再在CreateServiceProvider方法中使用构建助手去创建ServiceProvider。这里就可以看出来是作者预留的拓展点。

再看一下下面的代码:

在这里插入图片描述

使用默认提供的IServiceProviderFactory实现类DefaultServiceProviderFactory

从下面代码可以看到DefaultServiceProviderFactory的serviceProvider的构建助手是直接使用ServiceCollection

在这里插入图片描述

再进入BuildServiceProvider方法,看一下他创建的IServiceProvider的实现类

在这里插入图片描述

ServiceCollection构建出的IServiceProviderServiceProvider

3.加载ServiceProvider

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值