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
构建出的IServiceProvider
是ServiceProvider