using System; using System.Linq; using System.Reflection; using Microsoft.Extensions.DependencyInjection; using NadekoBot.Core.Common; using NadekoBot.Core.Modules.Music; using NadekoBot.Core.Services; using NadekoBot.Modules.Administration.Services; using NadekoBot.Modules.Music.Resolvers; using NadekoBot.Modules.Music.Services; namespace NadekoBot.Extensions { public static class ServiceCollectionExtensions { public static IServiceCollection AddBotStringsServices(this IServiceCollection services) => services .AddSingleton() .AddSingleton() .AddSingleton(); public static IServiceCollection AddConfigServices(this IServiceCollection services) { var baseType = typeof(ConfigServiceBase<>); foreach (var type in Assembly.GetCallingAssembly().ExportedTypes.Where(x => x.IsSealed)) { if (type.BaseType?.IsGenericType == true && type.BaseType.GetGenericTypeDefinition() == baseType) { services.AddSingleton(type); services.AddSingleton(x => (IConfigService)x.GetRequiredService(type)); } } return services; } public static IServiceCollection AddConfigMigrators(this IServiceCollection services) => services.AddSealedSubclassesOf(typeof(IConfigMigrator)); public static IServiceCollection AddMusic(this IServiceCollection services) => services .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton(svc => svc.GetService()); // consider using scrutor, because slightly different versions // of this might be needed in several different places public static IServiceCollection AddSealedSubclassesOf(this IServiceCollection services, Type baseType) { var subTypes = Assembly.GetCallingAssembly() .ExportedTypes .Where(type => type.IsSealed && baseType.IsAssignableFrom(type)); foreach (var subType in subTypes) { services.AddSingleton(baseType, subType); } return services; } } }