/// <summary> /// 自动注册模块所在程序集中导出的服务 /// </summary> /// <param name="moduleInstance"></param> /// <param name="context"></param> protected virtual async Task AutoRegisterModuleServicesAsync(object moduleInstance, AutoRegisterModuleServicesContext context) { var moduleType = moduleInstance.GetType(); if (!moduleType.ShouldRegisterServicesInAssembly()) { return; } var assembly = moduleType.Assembly; if (context.ProcessedAssemblies.Contains(assembly)) { return; } if (!await _modulesBootstrapInterceptor.RegisteringServicesInAssemblyAsync(context.Services, assembly)) { return; } var autoRegisterServicesInAssemblyAttribute = moduleType.GetCustomAttribute <AutoRegisterServicesInAssemblyAttribute>(); var serviceRegistrar = autoRegisterServicesInAssemblyAttribute?.ServiceRegistrarType is null ? context.Services.GetSingletonServiceInstance <IServiceRegistrar>() ?? throw new ModularityException($"cannot get {nameof(IServiceRegistrar)} instance in context's {nameof(IServiceCollection)}") : autoRegisterServicesInAssemblyAttribute.ServiceRegistrarType.ConstructInstance <IServiceRegistrar>(); try { serviceRegistrar.AddAssembly(context.Services, assembly); } catch (Exception ex) { throw new AutoRegisterServiceException(moduleType, serviceRegistrar.GetType(), ex); } context.ProcessedAssemblies.Add(assembly); }
/// <inheritdoc cref="IConfigureServices"/> protected virtual async Task ConfigureModuleServicesAsync(ServiceConfigurationContext context, AutoRegisterModuleServicesContext autoRegisterContext, object moduleInstance) { await AutoRegisterModuleServicesAsync(moduleInstance, autoRegisterContext); if (!await _modulesBootstrapInterceptor.ConfigureModuleServicesAsync(context, moduleInstance)) { return; } if (moduleInstance is IConfigureServices configureServices) { configureServices.ConfigureServices(context); } if (moduleInstance is IConfigureServicesAsync configureServicesAsync) { await configureServicesAsync.ConfigureServicesAsync(context); } }