1 对于IOC的具体介绍 Microsoft.Extensions 探索 / 依赖注入(DI) - 知乎 (zhihu.com)
使用 DI 容器需要熟悉下面的接口与类型,Microsoft.Extensions.DependencyInjection.IServiceCollection,该接口包含了一系列 Add 扩展方法来添加你的服务,该接口的默认实现为 Microsoft.Extensions.DependencyInjection.ServiceCollection 类。
容器接口叫做 IServiceCollection 是因为“微软”将容器中的类型视为我们程序所需的服务,有了这个前提将它命名为 “ServiceCollection”也就非常合理了。
System.IServiceProvider,使用 IServiceCollection 的扩展方法 BuildServiceProvider() 可以得到一个默认的 ServiceProvider 对象来让我们获取服务实例,ServiceProvider 实现了IServiceProvider 接口,该接口包含了一个 GetService() 方法来获取服务。IServiceProvider 接口的默认实现为 Microsoft.Extensions.DependencyInjection.ServiceProvider 类。
2、IServiceCollection,添加服务与生命周期
IServiceCollection 接口包含一系列的扩张方法让我们方便的添加服务,常用的包括下面三个方法,
- AddTransient,添加生命周期为Transient(短暂)的服务,这样的服务在每次被请求是都会创建一个新的实例。
- AddSingleton ,添加生命周期为Singleton(单例)的服务,这样的服务只有在首次请求是创建一个新的实例,之后都会使用这个实例。
- AddScoped,添加生命周期为Scoped(域内)的服务,这样的服务在一个自定义的“作用域”范围内是单例的。例如,在 http://ASP.NET Core 中 Scoped 服务在每一次请求中都是一个实例。
除此之外你也可以使用 Add 方法,并使用 ServiceLifetime 在参数中指定生命周期。
除了上面这三个常用方法之外,还有 TryAddTransient、TryAddSingleton、TryAddScoped 这三个用于添加服务的方法,与之前所提三个方法的区别在于带 Try 的这三个方法在添加服务时会检查服务是否已存在,若已经存在则不再添加。
services.AddSingleton<IMyDependency, MyDependency>();
//下面这行代码不起作用,因为IMyDependency服务已经存在。
services.TryAddSingleton<IMyDependency, DifferentDependency>();
除了上面所列的添加服务的方法,你还可以使用 TryAddEnumerable(ServiceDescriptor) 方法添加一个服务类型的可枚举对象作为服务,也就是将 IEnumerable<ServiceType>作为服务类型添加到容器。
2 对服务的再次具体介绍 .NET 通用主机 - .NET | Microsoft Learn
- Extensions Microsoft WPFextensions microsoft wpf dependencyinjection extensions microsoft castle dependenyinjection extensions microsoft castle windows windowsservices extensions microsoft extensions microsoft框架logging extensions microsoft logging core 第三方extensions microsoft logging 文件configuration extensions microsoft extensions code-extensions