gx 配置

This commit is contained in:
chfei committed 2026-09-18 19:22:49 +08:00
1 parent 0e1620c1f9
commit c732ecb1d2
7 files changed
+166 -16

No files matched your search

@@ -25,8 +25,8 @@ namespace MAX.Framework.DependencyInjection
];
/// <summary>
/// 兼容入口:只有服务集合,没有配置与环境(模块拿到的 <see cref="ModuleContext.Configuration"/> 是空配置)。
/// 新代码请用 <c>builder.AddStoreHub()</c>。
/// 兼容入口:只有服务集合,没有配置与环境(模块拿到的 <see cref="ModuleContext.Configuration"/> 是空配置),
/// 也拿不到 IConfigurationBuilder,所以模块自己的配置文件不会加载。新代码请用 <c>builder.AddStoreHub()</c>。
/// </summary>
public static IServiceCollection AddStoreHub(this IServiceCollection services)
{
@@ -49,6 +49,7 @@ namespace MAX.Framework.DependencyInjection
/// <item>发现所有 <see cref="IModule"/>,按 <see cref="IModule.Priority"/> 降序执行 <see cref="IModule.AddModule"/>,
/// 并把模块实例登记进容器,留给 <c>app.UseStoreHubModules()</c> 执行管道阶段。</item>
/// </list>
/// 这个入口不加载模块自己的配置文件,需要模块配置请用 <c>builder.AddStoreHub()</c>。
/// </summary>
public static IServiceCollection AddStoreHub(this IServiceCollection services, IConfiguration? configuration, IHostEnvironment? environment)
{
@@ -56,7 +57,22 @@ namespace MAX.Framework.DependencyInjection
// 同一个类可能同时实现 IStartup 与 IModule,这里缓存实例,保证两个阶段拿到的是同一个对象
Dictionary<Type, object> instances = [];
ModuleRegistry modules = DiscoverModules(assemblies, instances);
return services.AddStoreHubCore(assemblies, modules, instances, configuration, environment);
}
/// <summary>
/// 注册应用服务的公共实现:宿主入口(<c>builder.AddStoreHub()</c>)与 <see cref="IServiceCollection"/> 入口共用。
/// </summary>
internal static IServiceCollection AddStoreHubCore(
this IServiceCollection services,
IEnumerable<Assembly> assemblies,
ModuleRegistry modules,
IDictionary<Type, object> instances,
IConfiguration? configuration,
IHostEnvironment? environment)
{
RegisterDependencyMarkers(services, assemblies);
RunStartups(services, assemblies, instances);
@@ -66,8 +82,10 @@ namespace MAX.Framework.DependencyInjection
configuration ?? new ConfigurationBuilder().Build(),
environment);
RunModules(modules, context);
// 注册表必须在 Build() 之前进容器,UseStoreHubModules() 才拿得到
services.AddSingleton(RunModules(assemblies, instances, context));
services.AddSingleton(modules);
services.AddControllers(options =>
@@ -147,13 +165,19 @@ namespace MAX.Framework.DependencyInjection
}
/// <summary>
/// 发现所有 <see cref="IModule"/> 实现,按 <see cref="IModule.Priority"/> 降序执行服务注册阶段
/// 发现所有 <see cref="IModule"/> 实现,只创建实例,不执行任何阶段
/// </summary>
private static ModuleRegistry RunModules(IEnumerable<Assembly> assemblies, IDictionary<Type, object> instances, ModuleContext context)
internal static ModuleRegistry DiscoverModules(IEnumerable<Assembly> assemblies, IDictionary<Type, object> instances)
{
List<IModule> modules = [.. CreateInstances<IModule>(assemblies, instances).OrderByDescending(m => m.Priority)];
return new ModuleRegistry([.. CreateInstances<IModule>(assemblies, instances).OrderByDescending(m => m.Priority)]);
}
foreach (IModule module in modules)
/// <summary>
/// 执行所有模块的服务注册阶段(<see cref="IModule.AddModule"/>)
/// </summary>
private static void RunModules(ModuleRegistry modules, ModuleContext context)
{
foreach (IModule module in modules.Modules)
{
try
{
@@ -165,8 +189,6 @@ namespace MAX.Framework.DependencyInjection
throw new InvalidOperationException($"模块 {module.GetType().FullName} 的 AddModule 执行失败。", ex);
}
}
return new ModuleRegistry(modules);
}
/// <summary>
@@ -206,7 +228,10 @@ namespace MAX.Framework.DependencyInjection
}
}
private static IEnumerable<Assembly> GetApplicationAssemblies()
/// <summary>
/// 应用程序集(模块、Startup 都从这里发现)
/// </summary>
internal static IEnumerable<Assembly> GetApplicationAssemblies()
{
// 使用 AppTypeFinder:扫描应用输出目录 + 已加载程序集,
return StoreHubAppTypeFinder.Current.GetAssemblies();