gpt4 book ai didi

c# - 使用 IServiceCollection.AddTransient、IServiceCollection.AddSingleton 和 IServiceCollectionAddScoped 方法的实际场景有哪些?

转载 作者:可可西里 更新时间:2023-11-01 09:01:48 24 4
gpt4 key购买 nike

看完this帖子我可以理解 AddTransientAddScopedAddSingleton 之间的区别,但是,我看不到它们每个的实际用法。

我的理解是

添加 transient

每次客户端请求时创建一个新实例。

services.AddTransient<IDataAccess, DataAccess>();

每次客户端代码请求时都会返回一个新的 DataAccess 对象。更有可能是构造函数。

AddTransient 的用法

在我们必须访问数据库以读取和更新它并销毁访问对象 (DataAccess) 的情况下,最好使用 AddTransient - 不确定线程​​安全性。

AddScoped

为每个 http 网络请求创建一个新实例。

AddScoped 的使用

 services.AddScoped<ShoppingCart>(serviceProvider => ShoppingCart.GetShoppingCart(serviceProvider));

这意味着每个网络请求都将有自己的购物车实例,这意味着每个用户/客户都将为该 http 网络请求拥有自己的购物车实例。

添加单例

为所有 http 网络请求创建单个实例。

AddSingleton的使用

在示例应用程序中找到此代码,但我不明白它有何用处。

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 

谁能给出一个像样的实际例子,何时使用 AddSingleton 并检查我对 AddTransient 和 AddScoped 的理解是否正确?

最佳答案

您对所有 3 个作用域的理解都是正确的。

Transient 将在无法共享组件时使用。一个非线程安全的数据库访问对象就是一个例子。

Scoped 可用于 Entity Framework 数据库上下文。主要原因是从数据库中获取的实体将附加到请求中的所有组件都能看到的相同上下文。当然,如果您计划用它并行查询,则不能使用 Scoped。

Scoped 对象的另一个示例是某种 RequestContext 类,它包含例如调用者的用户名。中间件/MVC 过滤器可以请求它并填写信息,其他组件也可以请求它,它肯定会包含当前请求的信息。

Singleton 组件始终是共享的,因此它们最适合不需要绑定(bind)到请求的线程安全组件。一个示例是 IOptions,它提供对配置设置的访问。在单个静态 HttpClient 实例上使用 SendAsyncHttpClient 包装类也将是完全线程安全的,并且很适合作为 Singleton .

请注意,如果您有一个依赖于 Scoped 组件的 Singleton 组件,那么它的依赖项将先于它被释放。因此,组件不能依赖范围比自身小的另一个组件。

关于c# - 使用 IServiceCollection.AddTransient、IServiceCollection.AddSingleton 和 IServiceCollectionAddScoped 方法的实际场景有哪些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42608918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com