From 5624a4ab3605c57e7642972cbdb9a897471521dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Thu, 30 Dec 2021 10:01:08 +0100 Subject: [PATCH] feat: store type converters in dictionary to speed up converting --- .../Converters/TypeConverterRepository.cs | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs b/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs index 9a77e1c..9c79770 100644 --- a/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs +++ b/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs @@ -5,6 +5,9 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; using Microsoft.Extensions.DependencyInjection; using NosSmooth.Packets.Converters.Special; using NosSmooth.Packets.Errors; @@ -18,6 +21,8 @@ namespace NosSmooth.Packets.Converters; public class TypeConverterRepository : ITypeConverterRepository { private readonly IServiceProvider _serviceProvider; + private readonly ConcurrentDictionary _typeConverters; + private IReadOnlyList? _specialTypeConverters; /// /// Initializes a new instance of the class. @@ -25,6 +30,8 @@ public class TypeConverterRepository : ITypeConverterRepository /// The dependency injection service provider. public TypeConverterRepository(IServiceProvider serviceProvider) { + _typeConverters = new ConcurrentDictionary(); + _specialTypeConverters = null; _serviceProvider = serviceProvider; } @@ -35,8 +42,11 @@ public class TypeConverterRepository : ITypeConverterRepository /// The type converter or an error. public Result GetTypeConverter(Type type) { - var converterType = typeof(ITypeConverter<>).MakeGenericType(type); - var typeConverter = (ITypeConverter?)_serviceProvider.GetService(converterType); + var typeConverter = _typeConverters.GetOrAdd(type, (getType) => + { + var converterType = typeof(ITypeConverter<>).MakeGenericType(type); + return (ITypeConverter?)_serviceProvider.GetService(converterType); + }); if (typeConverter is null) { @@ -53,14 +63,17 @@ public class TypeConverterRepository : ITypeConverterRepository /// The type converter or an error. public Result> GetTypeConverter() { - var typeConverter = _serviceProvider.GetService>(); + var typeConverter = _typeConverters.GetOrAdd( + typeof(TParseType), + _ => _serviceProvider.GetService>() + ); if (typeConverter is null) { return new TypeConverterNotFoundError(typeof(TParseType)); } - return Result>.FromSuccess(typeConverter); + return Result>.FromSuccess((ITypeConverter)typeConverter); } /// @@ -203,8 +216,12 @@ public class TypeConverterRepository : ITypeConverterRepository private ISpecialTypeConverter? GetSpecialConverter(Type type) { - var specialConverters = _serviceProvider.GetServices(); - foreach (var specialConverter in specialConverters) + if (_specialTypeConverters is null) + { + _specialTypeConverters = _serviceProvider.GetServices().ToList(); + } + + foreach (var specialConverter in _specialTypeConverters) { if (specialConverter.ShouldHandle(type)) { -- 2.48.1