Esempio n. 1
0
        /// <summary>
        /// 增加要加载的模块文件
        /// </summary>
        /// <param name="moduleLoaderBuilder"></param>
        /// <param name="sourceOptionAction"></param>
        /// <param name="files"></param>
        /// <returns></returns>
        public static IModuleLoaderBuilder AddModuleFile(this IModuleLoaderBuilder moduleLoaderBuilder, Action <FileModuleSource>?sourceOptionAction, params string[] files)
        {
            var source = new FileModuleSource(files);

            sourceOptionAction?.Invoke(source);

            return(moduleLoaderBuilder.InternalAddModule(source));
        }
Esempio n. 2
0
        /// <summary>
        /// 增加要加载模块的目录
        /// </summary>
        /// <param name="moduleLoaderBuilder"></param>
        /// <param name="sourceOptionAction"></param>
        /// <param name="directories"></param>
        /// <returns></returns>
        public static IModuleLoaderBuilder AddModuleDirectory(this IModuleLoaderBuilder moduleLoaderBuilder, Action <DirectoryModuleSource>?sourceOptionAction, params string[] directories)
        {
            var source = new DirectoryModuleSource(directories);

            sourceOptionAction?.Invoke(source);

            return(moduleLoaderBuilder.InternalAddModule(source));
        }
Esempio n. 3
0
        /// <summary>
        /// 自动绑定标记了<see cref="AutoRegisterServicesInAssemblyAttribute"/>的模块中继承了<see cref="IOptions{TOptions}"/>的类。
        /// <para/>
        /// 默认情况下使用其完整名称为路径,在<see cref="IConfiguration"/>查找节点,并绑定值。
        /// <para/>
        /// 如 A 类命名空间为 B.C.D.E.F ,则<see cref="IConfiguration"/>查找路径为 B:C:D:E:F:A
        /// <para/>
        /// Note: 构建过程中必须有可访问的<see cref="IConfiguration"/> !!!
        /// </summary>
        /// <param name="moduleLoaderBuilder"></param>
        /// <param name="optionAction">配置选项的委托</param>
        /// <returns></returns>
        public static IModuleLoaderBuilder AutoBindModuleOptions(this IModuleLoaderBuilder moduleLoaderBuilder, Action <OptionsBindOptions>?optionAction = null)
        {
            var options = new OptionsBindOptions();

            optionAction?.Invoke(options);

            moduleLoaderBuilder.ModuleLoadOptions.ModulesBootstrapInterceptors.Add(new OptionsBindModulesBootstrapInterceptor(new DefaultOptionsBinder(options)));

            return(moduleLoaderBuilder);
        }
Esempio n. 4
0
        /// <summary>
        /// 模块加载完成(执行此方法后不能再进行模块追加)
        /// </summary>
        /// <param name="moduleLoaderBuilder"></param>
        /// <returns></returns>
        public static async Task <IServiceCollection> ModuleLoadCompleteAsync(this IModuleLoaderBuilder moduleLoaderBuilder)
        {
            var services     = moduleLoaderBuilder.Services;
            var moduleLoader = moduleLoaderBuilder.Build();

            var bootstrapper = moduleLoader.BuildBootstrapper();

            var context = new ServiceConfigurationContext(services);

            await bootstrapper.ConfigureServicesAsync(context).ConfigureAwait(false);

            services.AddSingleton <IModulesBootstrapper>(bootstrapper);

            services.Remove <IServiceRegistrar>();
            services.Remove <IModuleLoaderBuilder>();

            return(services);
        }
Esempio n. 5
0
        /// <summary>
        /// 使用指定的 <see cref="IOptionsBinder"/> 绑定模块程序集中的配置类
        /// </summary>
        /// <param name="moduleLoaderBuilder"></param>
        /// <param name="optionsBinder">选项绑定器</param>
        /// <returns></returns>
        public static IModuleLoaderBuilder AutoBindModuleOptions(this IModuleLoaderBuilder moduleLoaderBuilder, IOptionsBinder optionsBinder)
        {
            moduleLoaderBuilder.ModuleLoadOptions.ModulesBootstrapInterceptors.Add(new OptionsBindModulesBootstrapInterceptor(optionsBinder));

            return(moduleLoaderBuilder);
        }
Esempio n. 6
0
        /// <summary>
        /// 自动绑定模块程序集中的配置类
        /// </summary>
        /// <param name="moduleLoaderBuilder"></param>
        /// <param name="findOptionsTypesFunc">从程序集中获取需要绑定的类型的委托</param>
        /// <param name="sectionKeyGetFunc">获取配置类型对应的<see cref="IConfiguration"/>Key的委托</param>
        /// <returns></returns>
        public static IModuleLoaderBuilder AutoBindModuleOptions(this IModuleLoaderBuilder moduleLoaderBuilder, Func <Assembly, IEnumerable <Type> >?findOptionsTypesFunc = null, Func <Type, string?>?sectionKeyGetFunc = null)
        {
            moduleLoaderBuilder.ModuleLoadOptions.ModulesBootstrapInterceptors.Add(new OptionsBindModulesBootstrapInterceptor(new CustomKeyGetOptionsBinder(findOptionsTypesFunc, sectionKeyGetFunc)));

            return(moduleLoaderBuilder);
        }
Esempio n. 7
0
 /// <inheritdoc cref="AutoBindModuleOptions(IModuleLoaderBuilder, Action{OptionsBindOptions}?)"/>
 public static IModuleLoaderBuilder AutoBindModuleOptions(this IModuleLoaderBuilder moduleLoaderBuilder)
 {
     return(moduleLoaderBuilder.AutoBindModuleOptions(options => { }));
 }
Esempio n. 8
0
 /// <inheritdoc cref="AddModuleFile(IModuleLoaderBuilder, Action{FileModuleSource}?, string[])"/>
 public static IModuleLoaderBuilder AddModuleFile(this IModuleLoaderBuilder moduleLoaderBuilder, params string[] files)
 {
     return(moduleLoaderBuilder.AddModuleFile(null, files));
 }
Esempio n. 9
0
 /// <inheritdoc cref="AddModuleDirectory(IModuleLoaderBuilder, Action{DirectoryModuleSource}?, string[])"/>
 public static IModuleLoaderBuilder AddModuleDirectory(this IModuleLoaderBuilder moduleLoaderBuilder, params string[] directories)
 {
     return(moduleLoaderBuilder.AddModuleDirectory(null, directories));
 }
Esempio n. 10
0
 /// <summary>
 /// 增加要加载的模块源
 /// </summary>
 /// <param name="moduleLoaderBuilder"></param>
 /// <param name="moduleSource"></param>
 /// <returns></returns>
 public static IModuleLoaderBuilder AddModule(this IModuleLoaderBuilder moduleLoaderBuilder, IModuleSource moduleSource)
 {
     return(moduleLoaderBuilder.InternalAddModule(moduleSource));
 }
Esempio n. 11
0
 /// <summary>
 /// 增加要加载的模块
 /// </summary>
 /// <param name="moduleLoaderBuilder"></param>
 /// <param name="types"></param>
 /// <returns></returns>
 public static IModuleLoaderBuilder AddModule(this IModuleLoaderBuilder moduleLoaderBuilder, params Type[] types)
 {
     return(moduleLoaderBuilder.InternalAddModule(new TypeModuleSource(types)));
 }
Esempio n. 12
0
 /// <summary>
 /// 增加要加载的模块
 /// </summary>
 /// <typeparam name="TModule"></typeparam>
 /// <param name="moduleLoaderBuilder"></param>
 /// <returns></returns>
 public static IModuleLoaderBuilder AddModule <TModule>(this IModuleLoaderBuilder moduleLoaderBuilder) where TModule : IAppModule
 {
     return(moduleLoaderBuilder.AddModule(typeof(TModule)));
 }
Esempio n. 13
0
        private static IModuleLoaderBuilder InternalAddModule(this IModuleLoaderBuilder moduleLoaderBuilder, IModuleSource moduleSource)
        {
            moduleLoaderBuilder.AddModuleSource(moduleSource);

            return(moduleLoaderBuilder);
        }
Esempio n. 14
0
 /// <inheritdoc cref="ModuleLoadCompleteAsync(IModuleLoaderBuilder)"/>
 public static IServiceCollection ModuleLoadComplete(this IModuleLoaderBuilder moduleLoaderBuilder)
 {
     return(moduleLoaderBuilder.ModuleLoadCompleteAsync().ConfigureAwait(false).GetAwaiter().GetResult());
 }