Net6 DI源码分析Part1 ServiceCollection、ServiceDescriptor、ServiceLifetime、IServiceProvider
2022/2/10 9:42:33
本文主要是介绍Net6 DI源码分析Part1 ServiceCollection、ServiceDescriptor、ServiceLifetime、IServiceProvider,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
ServiceCollection、ServiceDescriptor、ServiceLifetime、IServiceProvider
Microsoft.Extensions.DependencyInjection.Abstractions
Microsoft.Extensions.DependencyInjection
基础使用方式
class Car : ICar { } interface ICar { }
IServiceCollection services = new ServiceCollection(); ServiceDescriptor transientService = new ServiceDescriptor(typeof(ICar), typeof(Car), ServiceLifetime.Transient); services.Add(transientService); services.AddTransient<ICar, Car>(); var serviceProvider = services.BuildServiceProvider(); var car = serviceProvider.GetService(typeof(ICar));
IServiceCollection
存放服务注册的集合
ServiceCollection
它是对IServiceCollection接口的默认实现,
核心属性private readonly List<ServiceDescriptor> _descriptors = new List<ServiceDescriptor>();
可以说是对List的一个包装类。
ServiceLifetime
用于描述服务声明周期的枚举 Singleton
、Scoped
、Transient
ServiceDescriptor
用于描述服务的注册信息
属性,后三个为提供的的服务实际类有关。
ServiceType
服务类型Lifetime
生命周期Type ImplementationType
Func<IServiceProvider,object> ImplementationFactory
object ImplementationInstance
它还提供了一系列静态方法供用于创建ServiceDescriptor
- ServiceDescriptor.Transient
transientService = ServiceDescriptor.Transient(typeof(ICar), typeof(Car));
- ServiceDescriptor Describe
例如ServiceDescriptor.Transient
transientService = ServiceDescriptor.Describe(typeof(ICar), typeof(Car), ServiceLifetime.Transient);
多数情况下是使用
ServiceCollectionServiceExtensions
为IServiceCollection
扩展的一系列方法添加服务到IServiceCollection集合。
ServiceCollectionServiceExtensions
作为IServiceCollection提供了一系列添加服务注册信息到IServiceCollection集合集合内,内部基本都是创建对应的ServiceDescriptor然后调用IServiceCollection.Add方法添加到集合内。
IServiceProviderFactory
IServiceProvider
的工厂接口默认实现为DefaultServiceProviderFactory
DefaultServiceProviderFactory
IServiceProvider
的工厂类
构造函数
public DefaultServiceProviderFactory() : this(ServiceProviderOptions.Default)
public DefaultServiceProviderFactory(ServiceProviderOptions options)
两个方法public IServiceCollection CreateBuilder(IServiceCollection services)
public IServiceProvider CreateServiceProvider(IServiceCollection containerBuilder)
它的内部CreateServiceProvider也是调用的ServiceCollectionContainerBuilderExtensions
提供的扩展方法。
ServiceCollectionContainerBuilderExtensions
对IServiceCollection的扩展作用就是创建IServiceProvider例如提供了BuildServiceProvider
IServiceProvider
仅有的一个方法为用于获取服务。object? GetService(Type serviceType);
ServiceProvider是它的默认实现
ServiceProvider`
ServiceProviderOptions
-
ValidateScopes
验证服务之前的Scopes依赖:例如 Singleton 服务依赖另一个Scoped服务,那么这个Scoped服务实例将被一个Singleton服务实例所引用,这时候此Scoped服务实例成了一个Singleton服务实例,如果设置为True
ServiceProvider
的构造方法内会创建一个CallSiteValidator
对象给自己的_callSiteValidator属性。 验证动作会在当Provider获取到CallSiteSerivce后对其进行验证。 -
ValidateOnBuild
IServiceProvider
对象被构建的时候会检验提供的每个ServiceDescriptor 的有效性 例如注册的Car
没有一个可以用的构造函数class Car : ICar { private Car() { } }
的情况 。如果设置为True
此时在buildServicePrivate时会抛出异常,否则需要等GetService时才会抛出异常。这是因为这个验证是在CallSiteFactory.GetCallSite
动作里面做的,当设置为true是 也只是在ServiceProvider
构造函数内调用了ValidateService
方法该方法循环调用CallSiteFactory.GetCallSite(ServiceDescriptor serviceDescriptor, CallSiteChain callSiteChain)
,也就是说把,ServiceCallSite
的创建动作提前。注意GetCallSite是个重载方法。具体区别会写在CallSiteFactory章节
这篇关于Net6 DI源码分析Part1 ServiceCollection、ServiceDescriptor、ServiceLifetime、IServiceProvider的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-09CMS内容管理系统是什么?如何选择适合你的平台?
- 2025-01-08CCPM如何缩短项目周期并降低风险?
- 2025-01-08Omnivore 替代品 Readeck 安装与使用教程
- 2025-01-07Cursor 收费太贵?3分钟教你接入超低价 DeepSeek-V3,代码质量逼近 Claude 3.5
- 2025-01-06PingCAP 连续两年入选 Gartner 云数据库管理系统魔力象限“荣誉提及”
- 2025-01-05Easysearch 可搜索快照功能,看这篇就够了
- 2025-01-04BOT+EPC模式在基础设施项目中的应用与优势
- 2025-01-03用LangChain构建会检索和搜索的智能聊天机器人指南
- 2025-01-03图像文字理解,OCR、大模型还是多模态模型?PalliGema2在QLoRA技术上的微调与应用
- 2025-01-03混合搜索:用LanceDB实现语义和关键词结合的搜索技术(应用于实际项目)