Exemplo n.º 1
0
        /// <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);
                }
            }
        }