猿问

服务注册选项

我有这个类,它从 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.cs


services.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


忽然笑
浏览 137回答 1
1回答

呼啦一阵风

Scoped 是每个 http 请求,Transient 是每个类型。由于您的授权标头是针对每个请求的,因此您可以将AuthenticationHeader类注册为 Scoped,这意味着为满足您的请求而创建的所有类型都将获得相同的实例。但是您也可以将其注册为 Transient,然后为您请求服务而创建的所有类型都将获得内部使用 IHttpContextAccessor 的新实例,AuthenticationHeader这将为您的 http 请求提供相同的 HttpContext。所以你可以两者都用,唯一要考虑的是内存消耗。作用域将使用更少的内存。编辑:&nbsp;实际上你也可以使用 Singleton 因为IHttpContextAccessor&nbsp;注册为 Singleton 并且在内部它使用 AsyncLocal 来存储当前上下文。但我不推荐它,因为将来AuthenticationHeader可以使用一些会破坏行为的额外逻辑来扩展。
随时随地看视频慕课网APP
我要回答