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