From 72493df9a6e8c65782c6369fd58c64364a734c23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Mon, 3 Jan 2022 16:06:51 +0100 Subject: [PATCH] feat: add caching of special converters --- .../Converters/TypeConverterRepository.cs | 47 ++++++++++++------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs b/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs index 7301f45..feb9567 100644 --- a/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs +++ b/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs @@ -22,6 +22,7 @@ public class TypeConverterRepository : ITypeConverterRepository { private readonly IServiceProvider _serviceProvider; private readonly ConcurrentDictionary _typeConverters; + private readonly ConcurrentDictionary _specialConverter; private IReadOnlyList? _specialTypeConverters; /// @@ -31,6 +32,7 @@ public class TypeConverterRepository : ITypeConverterRepository public TypeConverterRepository(IServiceProvider serviceProvider) { _typeConverters = new ConcurrentDictionary(); + _specialConverter = new ConcurrentDictionary(); _specialTypeConverters = null; _serviceProvider = serviceProvider; } @@ -42,11 +44,15 @@ public class TypeConverterRepository : ITypeConverterRepository /// The type converter or an error. public Result GetTypeConverter(Type type) { - var typeConverter = _typeConverters.GetOrAdd(type, (getType) => - { - var converterType = typeof(ITypeConverter<>).MakeGenericType(type); - return (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) { @@ -63,7 +69,8 @@ public class TypeConverterRepository : ITypeConverterRepository /// The type converter or an error. public Result> GetTypeConverter() { - var typeConverter = _typeConverters.GetOrAdd( + var typeConverter = _typeConverters.GetOrAdd + ( typeof(TParseType), _ => _serviceProvider.GetService>() ); @@ -216,19 +223,23 @@ public class TypeConverterRepository : ITypeConverterRepository private ISpecialTypeConverter? GetSpecialConverter(Type type) { - if (_specialTypeConverters is null) - { - _specialTypeConverters = _serviceProvider.GetServices().ToList(); - } - - foreach (var specialConverter in _specialTypeConverters) - { - if (specialConverter.ShouldHandle(type)) + return _specialConverter.GetOrAdd + ( + type, + (t) => { - return specialConverter; - } - } + _specialTypeConverters ??= _serviceProvider.GetServices().ToList(); - return null; + foreach (var specialConverter in _specialTypeConverters) + { + if (specialConverter.ShouldHandle(t)) + { + return specialConverter; + } + } + + return null; + } + ); } } \ No newline at end of file -- 2.49.0