namespace ALttPRandomizer.Service { using ALttPRandomizer.Model; using ALttPRandomizer.Randomizers; using ALttPRandomizer.Settings; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System; using System.Reflection; using System.Threading.Tasks; public class RandomizeService { public RandomizeService(IdGenerator idGenerator, IServiceProvider serviceProvider, ILogger logger) { this.IdGenerator = idGenerator; this.ServiceProvider = serviceProvider; this.Logger = logger; } private ILogger Logger { get; } private IdGenerator IdGenerator { get; } private IServiceProvider ServiceProvider { get; } public async Task RandomizeSeed(SeedSettings settings) { var id = this.IdGenerator.GenerateId(); this.Logger.LogInformation("Generating seed {seedId} with settings {@settings}", id, settings); var fi = typeof(RandomizerInstance).GetField(settings.Randomizer.ToString(), BindingFlags.Static | BindingFlags.Public); var randomizerKey = fi?.GetCustomAttribute()?.Name; if (randomizerKey == null) { throw new InvalidSettingsException("Invalid randomizer: {0}", settings.Randomizer); } var randomizer = this.ServiceProvider.GetRequiredKeyedService(randomizerKey); randomizer.Validate(settings); await randomizer.Randomize(id, settings); return id; } } }