~ruther/NosSmooth

72493df9a6e8c65782c6369fd58c64364a734c23 — František Boháček 3 years ago 16df48b
feat: add caching of special converters
1 files changed, 29 insertions(+), 18 deletions(-)

M Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs
M Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs => Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs +29 -18
@@ 22,6 22,7 @@ public class TypeConverterRepository : ITypeConverterRepository
{
    private readonly IServiceProvider _serviceProvider;
    private readonly ConcurrentDictionary<Type, ITypeConverter?> _typeConverters;
    private readonly ConcurrentDictionary<Type, ISpecialTypeConverter?> _specialConverter;
    private IReadOnlyList<ISpecialTypeConverter>? _specialTypeConverters;

    /// <summary>


@@ 31,6 32,7 @@ public class TypeConverterRepository : ITypeConverterRepository
    public TypeConverterRepository(IServiceProvider serviceProvider)
    {
        _typeConverters = new ConcurrentDictionary<Type, ITypeConverter?>();
        _specialConverter = new ConcurrentDictionary<Type, ISpecialTypeConverter?>();
        _specialTypeConverters = null;
        _serviceProvider = serviceProvider;
    }


@@ 42,11 44,15 @@ public class TypeConverterRepository : ITypeConverterRepository
    /// <returns>The type converter or an error.</returns>
    public Result<ITypeConverter> 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
    /// <returns>The type converter or an error.</returns>
    public Result<ITypeConverter<TParseType>> GetTypeConverter<TParseType>()
    {
        var typeConverter = _typeConverters.GetOrAdd(
        var typeConverter = _typeConverters.GetOrAdd
        (
            typeof(TParseType),
            _ => _serviceProvider.GetService<ITypeConverter<TParseType>>()
        );


@@ 216,19 223,23 @@ public class TypeConverterRepository : ITypeConverterRepository

    private ISpecialTypeConverter? GetSpecialConverter(Type type)
    {
        if (_specialTypeConverters is null)
        {
            _specialTypeConverters = _serviceProvider.GetServices<ISpecialTypeConverter>().ToList();
        }

        foreach (var specialConverter in _specialTypeConverters)
        {
            if (specialConverter.ShouldHandle(type))
        return _specialConverter.GetOrAdd
        (
            type,
            (t) =>
            {
                return specialConverter;
            }
        }
                _specialTypeConverters ??= _serviceProvider.GetServices<ISpecialTypeConverter>().ToList();

        return null;
                foreach (var specialConverter in _specialTypeConverters)
                {
                    if (specialConverter.ShouldHandle(t))
                    {
                        return specialConverter;
                    }
                }

                return null;
            }
        );
    }
}
\ No newline at end of file

Do not follow this link