using System; using System.Threading.Tasks; using Microsoft.Extensions.Logging; namespace MaddoShared; /// /// Dynamically resolves the concrete IImageCreator implementation at call time /// based on current PicSettings.ImageCreatorProvider. /// public class ImageCreatorMapper : IImageCreator { private readonly IServiceProvider _sp; private readonly PicSettings _settings; private readonly ILogger _logger; public ImageCreatorMapper(IServiceProvider sp, PicSettings settings, ILogger logger) { _sp = sp ?? throw new ArgumentNullException(nameof(sp)); _settings = settings ?? throw new ArgumentNullException(nameof(settings)); _logger = logger; } public Task CreateImageAsync(ImageState imgState, System.Drawing.Image logo) { var provider = (_settings.ImageCreatorProvider ?? "Sharp").Trim(); _logger?.LogDebug("Resolving IImageCreator for provider '{Provider}'", provider); return provider.Equals("ALTERNATE", StringComparison.OrdinalIgnoreCase) ? ResolveAndCall(imgState, logo) : ResolveAndCall(imgState, logo); } private Task ResolveAndCall(ImageState imgState, System.Drawing.Image logo) where T : IImageCreator { // Resolve the concrete implementation and forward the call var impl = (IImageCreator)_sp.GetService(typeof(T)); if (impl is null) { _logger?.LogWarning("Requested image creator {Type} is not registered. Falling back to ImageCreatorGDI.", typeof(T).Name); impl = (IImageCreator)_sp.GetService(typeof(ImageCreatorGDI)); } if (impl is null) throw new InvalidOperationException("No IImageCreator implementation is registered."); return impl.CreateImageAsync(imgState, logo); } }