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:
+12
-10
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user