/// <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)); }
/// <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)); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <inheritdoc cref="AutoBindModuleOptions(IModuleLoaderBuilder, Action{OptionsBindOptions}?)"/> public static IModuleLoaderBuilder AutoBindModuleOptions(this IModuleLoaderBuilder moduleLoaderBuilder) { return(moduleLoaderBuilder.AutoBindModuleOptions(options => { })); }
/// <inheritdoc cref="AddModuleFile(IModuleLoaderBuilder, Action{FileModuleSource}?, string[])"/> public static IModuleLoaderBuilder AddModuleFile(this IModuleLoaderBuilder moduleLoaderBuilder, params string[] files) { return(moduleLoaderBuilder.AddModuleFile(null, files)); }
/// <inheritdoc cref="AddModuleDirectory(IModuleLoaderBuilder, Action{DirectoryModuleSource}?, string[])"/> public static IModuleLoaderBuilder AddModuleDirectory(this IModuleLoaderBuilder moduleLoaderBuilder, params string[] directories) { return(moduleLoaderBuilder.AddModuleDirectory(null, directories)); }
/// <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)); }
/// <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))); }
/// <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))); }
private static IModuleLoaderBuilder InternalAddModule(this IModuleLoaderBuilder moduleLoaderBuilder, IModuleSource moduleSource) { moduleLoaderBuilder.AddModuleSource(moduleSource); return(moduleLoaderBuilder); }
/// <inheritdoc cref="ModuleLoadCompleteAsync(IModuleLoaderBuilder)"/> public static IServiceCollection ModuleLoadComplete(this IModuleLoaderBuilder moduleLoaderBuilder) { return(moduleLoaderBuilder.ModuleLoadCompleteAsync().ConfigureAwait(false).GetAwaiter().GetResult()); }