当前位置:首页 > Web开发 > 正文

后续该服务的所有元数据都存在 _items

2024-03-31 Web开发

深入理解net core中的依赖注入、Singleton、Scoped、Transient(一)

深入理解net core中的依赖注入、Singleton、Scoped、Transient(二)

深入理解net core中的依赖注入、Singleton、Scoped、Transient(三)

深入理解net core中的依赖注入、Singleton、Scoped、Transient(四)


在学习 Asp.Net Core 的过程中,注入可以说是无处不在,对付 .Net Core 来说,它是独立的一个措施集,没有庞大的依赖项和配置文件,所以对付学习 Asp.Net Core 源码的伴侣来说,注入作为一个起点非常合适,园子里确实有许多关于注入的博客,不过 .Net Core2.0 已经出来了,注入这一块做了一些 更新,其实有不少 .net 开发人员对微软改来改去这一点不是很对劲,加大了学习本钱,其实窜改分为两种,一种是 Asp.Net Core Mvc 常用 Api 接口的变动(或者配置的变动),这点在 2.0 以来很少有这样的情况了,也就是说 Asp.Net Core Mvc 根基趋于不变了,另一类就是对代码的优化,前者对研发的跟进造成了很大的伤害值,而后者对付研发而言无关紧要,对付乐于学习源码的措施员而言或许能从中带来许多思考。

所以我筹算从头分析 .Net Core2.0 的注入 ,实际颁布版本为 .netstandard2.0 措施集为 Microsoft.Extensions.DependencyInjection.dll。

在 .Net Core 中,注入描述为为三个过程,注册处事->创建容器->创建东西,所以我也会分为三个模块来介绍

技术图片

注入元数据

如果接触过 .Net Core 则或多或少已经接触过注入,下面的代码注册了具有三种生命周期的处事,然后创建一个容器,最后使用容器供给这三个处事的实例东西,我们不雅察看他们的生命周期,看到输出功效根基对 AddTransient 以及 AddSingleton 这两种方法注册的处事具有怎样的生命周期城市有所判断,而 AddScoped 方法注册的处事就庞大一点。

我们看到通过 BuilderServiceProvider 要领创建了一个容器,而容器挪用 CreateScope 就可以创建了两个具有范畴的容器,而 AddScoped 方法注册的处事在差别范畴内的生命周期是不一样的,而不异范畴下的生命周期和 AddSingleton 是一致的。

interface ITransient { } class Transient : ITransient { } interface ISingleton { } class Singleton : ISingleton { } interface IScoped { } class Scoped : IScoped { } class Program { static void Main(string[] args) { IServiceCollection services = new ServiceCollection(); services = services.AddTransient<ITransient, Transient>(); services = services.AddScoped<IScoped, Scoped>(); services = services.AddSingleton<ISingleton, Singleton>(); IServiceProvider serviceProvider = services.BuildServiceProvider(); Console.WriteLine(ReferenceEquals(serviceProvider.GetService<ITransient>(), serviceProvider.GetService<ITransient>())); Console.WriteLine(ReferenceEquals(serviceProvider.GetService<IScoped>(), serviceProvider.GetService<IScoped>())); Console.WriteLine(ReferenceEquals(serviceProvider.GetService<ISingleton>(), serviceProvider.GetService<ISingleton>())); IServiceProvider serviceProvider1 = serviceProvider.CreateScope().ServiceProvider; IServiceProvider serviceProvider2 = serviceProvider.CreateScope().ServiceProvider; Console.WriteLine(ReferenceEquals(serviceProvider1.GetService<IScoped>(), serviceProvider1.GetService<IScoped>())); Console.WriteLine(ReferenceEquals(serviceProvider1.GetService<IScoped>(), serviceProvider2.GetService<IScoped>())); Console.WriteLine(ReferenceEquals(serviceProvider1.GetService<ISingleton>(), serviceProvider2.GetService<ISingleton>())); /* False * True * True * True * False * True */ } }

IServiceCollection

public interface IServiceCollection : IList<ServiceDescriptor> { }

是一个调集,用来存放用户注册的处事元数据

ServiceDescriptor

看上面的例子我们如何添加注入应该也能猜到 ServiceDescriptor 包罗哪些属性了吧!至少包罗一个接口类型、实现类型和生命周期,是的就是如此。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32650.html