/// <summary> /// 添加模块配置 /// </summary> /// <param name="services"></param> /// <param name="modules"></param> /// <returns></returns> public static IServiceCollection AddModuleOptions(this IServiceCollection services, IModuleCollection modules) { var collection = new ModuleOptionsCollection(); if (modules != null && modules.Any()) { foreach (var module in modules) { var descriptor = GetDescriptor(services, module); collection.Add(descriptor); } } //注入变更事件 services.AddChangedEvent(collection); //注入配置集合 services.AddSingleton <IModuleOptionsCollection>(collection); //注入引擎 services.AddSingleton <IModuleOptionsEngine, ModuleOptionsEngine>(); //从存储加载数据 services.BuildServiceProvider().GetService <IModuleOptionsEngine>().LoadFromStorage(services); return(services); }
/// <summary> /// 注入变更事件 /// </summary> /// <param name="services"></param> /// <param name="collection"></param> private static void AddChangedEvent(this IServiceCollection services, ModuleOptionsCollection collection) { foreach (var descriptor in collection) { var changedEventTypes = descriptor.Module.AssemblyDescriptor.Infrastructure.GetTypes().Where(m => typeof(IModuleOptionsChangedEvent<>).IsImplementType(m)).ToList(); if (!changedEventTypes.Any()) continue; foreach (var eventType in changedEventTypes) { //将变更事件保存下来,方便配置更改时从容器中查找 var optionType = eventType.GetInterfaces().First().GetGenericArguments()[0]; collection.First(m => m.OptionsType == optionType).ChangedEvents.Add(eventType); services.AddSingleton(eventType); } } }