From 66cbcbea2f7a90dc245f236573984d412c71885e Mon Sep 17 00:00:00 2001 From: Valters Melnalksnis Date: Fri, 24 Jun 2022 16:28:44 +0300 Subject: [PATCH] fix: Cache JsonSerializerOptions for NordigenHttpClient This reduces execution time and memory allocation for GetRequiredService() by an order of magnitude --- .../ServiceCollectionExtensions.cs | 1 + .../NordigenHttpClient.cs | 14 +++------- .../NordigenJsonSerializerOptions.cs | 27 +++++++++++++++++++ 3 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 source/VMelnalksnis.NordigenDotNet/NordigenJsonSerializerOptions.cs diff --git a/source/VMelnalksnis.NordigenDotNet.DependencyInjection/ServiceCollectionExtensions.cs b/source/VMelnalksnis.NordigenDotNet.DependencyInjection/ServiceCollectionExtensions.cs index ef013ab..21d47d5 100644 --- a/source/VMelnalksnis.NordigenDotNet.DependencyInjection/ServiceCollectionExtensions.cs +++ b/source/VMelnalksnis.NordigenDotNet.DependencyInjection/ServiceCollectionExtensions.cs @@ -73,6 +73,7 @@ public static class ServiceCollectionExtensions return serviceCollection .AddSingleton() + .AddSingleton() .AddTransient() .AddTransient() .AddTransient() diff --git a/source/VMelnalksnis.NordigenDotNet/NordigenHttpClient.cs b/source/VMelnalksnis.NordigenDotNet/NordigenHttpClient.cs index 1dd20bc..b212b47 100644 --- a/source/VMelnalksnis.NordigenDotNet/NordigenHttpClient.cs +++ b/source/VMelnalksnis.NordigenDotNet/NordigenHttpClient.cs @@ -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; /// wrapper that uses the correct serialization settings for all requests. @@ -24,15 +20,11 @@ public sealed class NordigenHttpClient /// Initializes a new instance of the class. /// Http client configured for making requests to the Nordigen API. - /// Time zone provider for date and time serialization. - public NordigenHttpClient(HttpClient httpClient, IDateTimeZoneProvider dateTimeZoneProvider) + /// Nordigen specific instance of . + public NordigenHttpClient(HttpClient httpClient, NordigenJsonSerializerOptions nordigenJsonSerializerOptions) { _httpClient = httpClient; - - _serializerOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web) - { - Converters = { new JsonStringEnumConverter() }, - }.ConfigureForNodaTime(dateTimeZoneProvider); + _serializerOptions = nordigenJsonSerializerOptions.Options; } internal async Task Get(string requestUri, CancellationToken cancellationToken) diff --git a/source/VMelnalksnis.NordigenDotNet/NordigenJsonSerializerOptions.cs b/source/VMelnalksnis.NordigenDotNet/NordigenJsonSerializerOptions.cs new file mode 100644 index 0000000..eac9e38 --- /dev/null +++ b/source/VMelnalksnis.NordigenDotNet/NordigenJsonSerializerOptions.cs @@ -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; + +/// for . +public sealed class NordigenJsonSerializerOptions +{ + /// Initializes a new instance of the class. + /// Time zone provider for date and time serialization. + public NordigenJsonSerializerOptions(IDateTimeZoneProvider dateTimeZoneProvider) + { + Options = new JsonSerializerOptions(JsonSerializerDefaults.Web) + { + Converters = { new JsonStringEnumConverter() }, + }.ConfigureForNodaTime(dateTimeZoneProvider); + } + + internal JsonSerializerOptions Options { get; } +}