fix: Cache user agent header value

Currently the user agent header value was created for each TokenDelegatingHandler and NordigenHttpClient.
By creating the header value once, both the execution time and allocated memory for GetRequiredService<INordigenClient>() was reduced.

Original:
|     Mean |    Error |   StdDev |  Gen 0 |  Gen 1 | Allocated |
|--------- |---------:|---------:|-------:|-------:|----------:|
| 33.16 us | 0.102 us | 0.090 us | 5.3101 | 0.0916 |     44 KB |
After caching:
|     Mean |    Error |   StdDev |  Gen 0 |  Gen 1 | Allocated |
|--------- |---------:|---------:|-------:|-------:|----------:|
| 26.02 us | 0.091 us | 0.086 us | 4.8218 | 0.0000 |     39 KB |
This commit is contained in:
Valters Melnalksnis
2022-06-24 16:28:12 +03:00
parent f4002a4363
commit 29949fa64f
@@ -4,7 +4,9 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using JetBrains.Annotations;
@@ -27,6 +29,15 @@ namespace VMelnalksnis.NordigenDotNet.DependencyInjection;
[PublicAPI]
public static class ServiceCollectionExtensions
{
private static readonly ProductInfoHeaderValue _userAgent;
static ServiceCollectionExtensions()
{
var assemblyName = typeof(INordigenClient).Assembly.GetName();
var assemblyShortName = assemblyName.Name ?? assemblyName.FullName.Split(',').First();
_userAgent = new(assemblyShortName, assemblyName.Version?.ToString());
}
/// <summary>Adds all required services for <see cref="INordigenClient"/>.</summary>
/// <param name="serviceCollection">The service collection in which to register the services.</param>
/// <param name="configuration">The configuration to which to bind options models.</param>
@@ -75,15 +86,6 @@ public static class ServiceCollectionExtensions
private static void ConfigureNordigenClient(IServiceProvider provider, HttpClient client)
{
client.BaseAddress = provider.GetRequiredService<IOptionsMonitor<NordigenOptions>>().CurrentValue.BaseAddress;
var assembly = typeof(INordigenClient).Assembly.GetName();
var assemblyName = assembly.Name ??
throw new InvalidOperationException($"Assembly {assembly.FullName} name is not specified");
var assemblyVersion = assembly.Version ??
throw new InvalidOperationException($"Assembly {assembly.FullName} version is not specified");
client.DefaultRequestHeaders.UserAgent.Add(new(assemblyName, assemblyVersion.ToString()));
client.DefaultRequestHeaders.UserAgent.Add(_userAgent);
}
}