/
vshmidt
/
masstransit
Обзор
Документация
Войти
/
vshmidt
/
masstransit
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
src/MassTransit.Abstractions/Observers/Observables/RetryFaultObserverCache.cs
58 строк
2 KB
Chris Patterson
Massive file cleanup
27 мар 2024, 02:43
27 мар 2024, 02:43
2ac69e8
Код
Авторство
О чём код?
namespace MassTransit.Observables { using System; using System.Collections.Concurrent; using System.Threading.Tasks; public class RetryFaultObserverCache { readonly ConcurrentDictionary<Type, Lazy<IRetryFaultObserver>> _types = new ConcurrentDictionary<Type, Lazy<IRetryFaultObserver>>(); IRetryFaultObserver this[Type type] => _types.GetOrAdd(type, CreateTypeConverter).Value; public static Task RetryFault(IRetryObserver observer, RetryContext context, Type contextType) { return Cached.Converters.Value[contextType].RetryFault(observer, context); } static Lazy<IRetryFaultObserver> CreateTypeConverter(Type type) { return new Lazy<IRetryFaultObserver>(() => CreateConverter(type)); } static IRetryFaultObserver CreateConverter(Type type) { var converterType = typeof(RetryFaultObserver<>).MakeGenericType(type); return Activator.CreateInstance(converterType) as IRetryFaultObserver ?? throw new InvalidOperationException("Failed to create Retry Fault Observer"); } interface IRetryFaultObserver { Task RetryFault(IRetryObserver observer, RetryContext context); } class RetryFaultObserver<T> : IRetryFaultObserver where T : class, PipeContext { public Task RetryFault(IRetryObserver observer, RetryContext context) { if (context == null) throw new ArgumentNullException(nameof(context)); return observer.RetryFault((RetryContext<T>)context); } } static class Cached { internal static readonly Lazy<RetryFaultObserverCache> Converters = new Lazy<RetryFaultObserverCache>(() => new RetryFaultObserverCache()); } } }