Варианты регистрации услуг - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть этот класс, который получает значение заголовка авторизации из заголовка и сохраняет его в переменной следующим образом:

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 с использованием Constructor Injection.

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 Ответ

2 голосов
/ 24 апреля 2019

Scoped для http-запроса, Transient для каждого типа.

Поскольку ваш заголовок авторизации находится на запросе, вы можете зарегистрировать класс AuthenticationHeader как Scoped, что означает, что все типы, созданные для обслуживания вашего запроса, получат такой же экземпляр.

Но вы также можете зарегистрировать его как Transient, тогда все типы, созданные для вашего запроса, получат новый экземпляр AuthenticationHeader, который внутренне использует IHttpContextAccessor, который даст вам тот же HttpContext для вашего http-запроса.

Таким образом, вы можете использовать оба, единственное соображение - это потребление памяти. Scoped будет использовать меньше памяти.

Edit: На самом деле вы также можете использовать Singleton, потому что IHttpContextAccessor зарегистрирован как Singleton и внутренне , он использует AsyncLocal для хранения текущего контекста. Но я не рекомендовал бы это, потому что в будущем AuthenticationHeader может быть расширен с некоторой дополнительной логикой, которая нарушит поведение.

...