gx 配置
This commit is contained in:
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();
|
||||
|
||||
Reference in new issue
Block a user