using Microsoft.Extensions.Logging; public class SongResolver { private readonly IEnumerable _songValidators; private readonly ILogger logger; public SongResolver(ILogger logger) { this.logger = logger; this._songValidators = new List(); foreach (Type mytype in System.Reflection.Assembly.GetExecutingAssembly().GetTypes() .Where(mytype => mytype.GetInterfaces().Contains(typeof(ISongValidator)) && !(mytype.Name.EndsWith("Base")))) { if (Activator.CreateInstance(mytype) is ISongValidator validator) { logger.LogDebug("Registering song validator: {ValidatorType}", mytype.Name); this._songValidators = this._songValidators.Append(validator); } } } public async Task ResolveSongAsync(Uri songUri) { foreach (var validator in _songValidators) { if (validator.CanValidateUri(songUri)) { if (!await validator.CanExtractSongMetadataAsync(songUri)) { this.logger.LogWarning("Cannot extract metadata for song URI: {SongUri}", songUri); return new Song { Artist = "Unknown Artist", Name = "Unknown Title", Url = songUri.ToString(), Provider = SongProvider.PlainHttp, }; } return await validator.ValidateAsync(songUri); } } return new Song { Artist = "Unknown Artist", Name = "Unknown Title", Url = songUri.ToString(), Provider = SongProvider.PlainHttp, }; } public bool CanValidate(Uri songUri) { foreach (var validator in _songValidators) { if (validator.CanValidateUri(songUri)) { return true; } } return false; } }