为了账号安全,请及时绑定邮箱和手机立即绑定

服务注册选项

服务注册选项

C#
忽然笑 2022-12-24 14:59:14
我有这个类,它从 Header 获取 Authorization Header 值并将其存储到变量中,如下所示:public class AuthenticationHeader{   private static  IHttpContextAccessor _httpContextAccessor;   public AuthenticationHeader(IHttpContextAccessor httpContextAccessor)   {      _httpContextAccessor = httpContextAccessor;   }   public string AuthHeader => _httpContextAccessor.HttpContext?.Request.Headers["Authorization"]}我已经像这样在我的 DI 中注册了这个课程Startup.csservices.AddScoped<AuthenticationHeader>();然后使用构造函数注入在我的 NetworkClient 中使用此类。public ClubMatasClient(HttpClient client, ILogger<ClubMatasClient> logger, AuthenticationHeader authHeader){   _client = client;   client.BaseAddress = new Uri("url");   client.DefaultRequestHeaders.Add("Accept", "application/json");   _logger = logger;   AuthToken = authHeader.AuthHeader;}我已经阅读了此处文档的生命周期,Scoped但我很困惑应该使用哪一个。我不想混合我的请求标头中的身份验证标头。Transient
查看完整描述

1 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

Scoped 是每个 http 请求,Transient 是每个类型。

由于您的授权标头是针对每个请求的,因此您可以将AuthenticationHeader类注册为 Scoped,这意味着为满足您的请求而创建的所有类型都将获得相同的实例。

但是您也可以将其注册为 Transient,然后为您请求服务而创建的所有类型都将获得内部使用 IHttpContextAccessor 的实例,AuthenticationHeader这将为您的 http 请求提供相同的 HttpContext。

所以你可以两者都用,唯一要考虑的是内存消耗。作用域将使用更少的内存。

编辑: 实际上你也可以使用 Singleton 因为IHttpContextAccessor 注册为 Singleton 并且在内部它使用 AsyncLocal 来存储当前上下文。但我不推荐它,因为将来AuthenticationHeader可以使用一些会破坏行为的额外逻辑来扩展。


查看完整回答
反对 回复 2022-12-24
  • 1 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号