手机版

的三种模式 网络核心注入:单例、作用域和瞬态

时间:2021-08-26 来源:互联网 编辑:宝哥软件园 浏览:

从上一篇不如题目的《.net core 并发下的线程安全问题》文章中,我们可以扩展对的三种模式的理解。网络核心注入:单例、作用域和瞬态

我们都知道Startup中的ConfigureServices可以注入我们想要的服务,那么注入的时候有三种模式可以选择,那么我们应该在什么时候选择什么模式呢?

在谈注入方式之前,我觉得有必要先了解一下使用寿命的概念!

服务生存期:ASP.NET核心提供了一个内置的服务容器IServiceProvider,它负责管理服务的生命周期,从创建依赖注入容器开始(即把服务注入到你要使用的类的构造函数中),然后框架负责创建依赖关系的实例,并在不再需要的时候进行处理(即我们调用服务时,容器会释放注入的服务本身)。

IServiceProvider如何负责?

//系统。IServiceProviderusing系统;公共接口IServiceProvider{对象GetService(类型ServiCeType);}可以看到,提供服务的对象是通过GetService接口的方法获取的。然后再看深一点,让我们看看微软是怎么组装的。extensions.dependencyinjection提供了这个容器

//微软。扩展使用微软。扩展。依赖注射;使用系统;公共接口IServiceProviderFactoryTContainerBuilder { TContainerBuilder CreateBuilder(IServiceCollection services);IServiceProvider CreateServiceProvider(TContainerBuilder containerBuilder);}看看上面的IServiceProviderFactory界面是否熟悉。这个容器中会有一个IServiceCollection。如何添加(实现)服务

//微软。扩展。依赖注入。服务集合服务扩展使用系统;私有静态IServiceCollection Add(IServiceCollection集合,Type serviceType,Type implementationType,ServiceLifetime生存期){ service descriptor item=new service descriptor(service Type,implementationType,lifetime);收藏。添加(项目);退货收集;}这里说得很清楚,和我们今天的话题很接近。直接来

//微软。extensions . dependency injection . servicelifetime public枚举服务生存期{Singleton,scoped,Transient}上面的枚举提供了三种模式:Singleton,Scoped和Transient。转到微软的文档,首先了解这三种模式。服务集合服务扩展中只有三种方法(带有重载)

从源代码中完全可以想象,这三个方法继承了IServiceCollection。好了,先说这三种模式。毕竟,我们不太关心实现(如果我们关心,请查看文档并查看源代码)

(1)Singleton单实例模式:单实例对象对于每个对象、每个请求都是一样的,对于不同的客户端、不同的请求可以说是一样的。

(2)Transient transient模式:Transient对象总是不同的,每次都会创建一个新的实例,无论是同一个请求(同一个请求中的不同服务)还是同一个客户端。

(3)作用域范围模式:作用域对象在一个客户端请求中相同,但在多个客户端请求中不同。(这句话是文件原话,我觉得描述的很清楚)

何时使用哪种模式?这个不好说(希望这个能成为讨论点)

例如:

1.记录器可以实现为单个实例,因为在整个生命周期中只能使用一个实例;

2.数据库访问上下文(DbContext)应该是最佳候选,因为服务。默认情况下AddDbContext是Scoped(哈哈哈);

3.如果需要使用深度依赖图来创建唯一的对象,可以考虑将该对象注册为临时对象。

再看看别人怎么说(Scoped的描述可能理解不一样,但这是个见仁见智的问题,老铁)

还有一个stackoverflow

根据别人的经验,可以作为参考:

如何验证?请用一个官方示例运行它,以查看结果:

浏览器的第一个标签页(第一个请求可视为客户端):

浏览器的第二个标签页(第二个请求,可视为另一个客户端):

看了上面的结果,我就不多说了。

这种扩展的理解相当有趣,尤其是寻找这三种模式的使用场景。虽然我有些意见,但绝对不完整。如果你有更好的意见,我愿意和你分享。

下一篇文章的扩展似乎要回到源头,而注入。网芯,哈哈哈.

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:的三种模式 网络核心注入:单例、作用域和瞬态是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。