namespace Deal.Modules.Cards.Application.Sources; /// /// Выбирает провайдера содержимого по виду источника. /// public sealed class SourceContentResolver { private readonly Dictionary _providers; /// /// Создаёт реестр провайдеров содержимого. /// /// Зарегистрированные провайдеры; последний по виду перекрывает предыдущих. public SourceContentResolver(IEnumerable providers) { _providers = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (ISourceContentProvider provider in providers) { _providers[provider.Kind] = provider; } } /// /// Есть ли провайдер для вида источника. /// /// Ссылка на источник. /// true — содержимое можно загрузить лениво. public bool CanResolve(SourceRef source) => _providers.ContainsKey(source.Kind); /// /// Загружает содержимое записи источника. /// /// Ссылка на источник. /// Токен отмены. /// Содержимое записи либо null — провайдера нет/источник не отдал данные. public Task ResolveAsync(SourceRef source, CancellationToken ct) { return _providers.TryGetValue(source.Kind, out ISourceContentProvider? provider) ? provider.LoadAsync(source, ct) : Task.FromResult(null); } }