fix: Cache JsonSerializerOptions for NordigenHttpClient

This reduces execution time and memory allocation for GetRequiredService<INordigenClient>() by an order of magnitude
This commit is contained in:
Valters Melnalksnis
2022-06-24 16:28:44 +03:00
parent 25951fd00b
commit 66cbcbea2f
3 changed files with 31 additions and 11 deletions
@@ -73,6 +73,7 @@ public static class ServiceCollectionExtensions
return serviceCollection
.AddSingleton<NordigenTokenCache>()
.AddSingleton<NordigenJsonSerializerOptions>()
.AddTransient<INordigenClient, NordigenClient>()
.AddTransient<IAccountClient, AccountClient>()
.AddTransient<IAgreementClient, AgreementClient>()
@@ -7,13 +7,9 @@ using System.Net.Http;
using System.Net.Http.Json;
using System.Runtime.CompilerServices;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using NodaTime;
using NodaTime.Serialization.SystemTextJson;
namespace VMelnalksnis.NordigenDotNet;
/// <summary><see cref="HttpClient"/> wrapper that uses the correct serialization settings for all requests.</summary>
@@ -24,15 +20,11 @@ public sealed class NordigenHttpClient
/// <summary>Initializes a new instance of the <see cref="NordigenHttpClient"/> class.</summary>
/// <param name="httpClient">Http client configured for making requests to the Nordigen API.</param>
/// <param name="dateTimeZoneProvider">Time zone provider for date and time serialization.</param>
public NordigenHttpClient(HttpClient httpClient, IDateTimeZoneProvider dateTimeZoneProvider)
/// <param name="nordigenJsonSerializerOptions">Nordigen specific instance of <see cref="JsonSerializerOptions"/>.</param>
public NordigenHttpClient(HttpClient httpClient, NordigenJsonSerializerOptions nordigenJsonSerializerOptions)
{
_httpClient = httpClient;
_serializerOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web)
{
Converters = { new JsonStringEnumConverter() },
}.ConfigureForNodaTime(dateTimeZoneProvider);
_serializerOptions = nordigenJsonSerializerOptions.Options;
}
internal async Task<TResult?> Get<TResult>(string requestUri, CancellationToken cancellationToken)
@@ -0,0 +1,27 @@
// Copyright 2022 Valters Melnalksnis
// Licensed under the Apache License 2.0.
// See LICENSE file in the project root for full license information.
using System.Text.Json;
using System.Text.Json.Serialization;
using NodaTime;
using NodaTime.Serialization.SystemTextJson;
namespace VMelnalksnis.NordigenDotNet;
/// <summary><see cref="JsonSerializerOptions"/> for <see cref="NordigenHttpClient"/>.</summary>
public sealed class NordigenJsonSerializerOptions
{
/// <summary>Initializes a new instance of the <see cref="NordigenJsonSerializerOptions"/> class.</summary>
/// <param name="dateTimeZoneProvider">Time zone provider for date and time serialization.</param>
public NordigenJsonSerializerOptions(IDateTimeZoneProvider dateTimeZoneProvider)
{
Options = new JsonSerializerOptions(JsonSerializerDefaults.Web)
{
Converters = { new JsonStringEnumConverter() },
}.ConfigureForNodaTime(dateTimeZoneProvider);
}
internal JsonSerializerOptions Options { get; }
}