我有这个类,它从 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可以使用一些会破坏行为的额外逻辑来扩展。
- 1 回答
- 0 关注
- 135 浏览
添加回答
举报
0/150
提交
取消
