public static IConfiguration BuildTenantAppConfiguration(IConfiguration configRoot, IHostEnvironment environment, string tenantId, Action <TenantBuilderContext, IConfigurationBuilder> configureAppConfiguration = null) { var tenantConfigBuilder = new ConfigurationBuilder() .SetBasePath(environment.ContentRootPath) .AddJsonFile($"appsettings.{tenantId}.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{tenantId}.{environment.EnvironmentName}.json", optional: true, reloadOnChange: true); var tenantConfig = tenantConfigBuilder.Build() as ConfigurationRoot; //Final tenant config var finalTenantConfigBuilder = new ConfigurationBuilder(); finalTenantConfigBuilder.AddConfiguration(configRoot); finalTenantConfigBuilder.AddConfiguration(tenantConfig); var finalTenantConfig = finalTenantConfigBuilder.Build() as ConfigurationRoot; if (configureAppConfiguration != null) { var context = new TenantBuilderContext(tenantId) { Configuration = finalTenantConfig, HostingEnvironment = environment }; configureAppConfiguration(context, tenantConfigBuilder); tenantConfig.Dispose(); finalTenantConfig.Dispose(); tenantConfig = tenantConfigBuilder.Build() as ConfigurationRoot; //Final tenant config finalTenantConfigBuilder = new ConfigurationBuilder(); finalTenantConfigBuilder.AddConfiguration(configRoot); finalTenantConfigBuilder.AddConfiguration(tenantConfig); finalTenantConfig = finalTenantConfigBuilder.Build() as ConfigurationRoot; } return(finalTenantConfig); }
private void ConfigureTenants(MultitenantContainer mtc) { var serviceProvider = new AutofacServiceProvider(mtc); var hostingEnvironment = serviceProvider.GetRequiredService <IHostEnvironment>(); var config = serviceProvider.GetRequiredService <IConfiguration>(); var tenantConfigurations = serviceProvider.GetServices <ITenantConfiguration>(); if (_options.AutoAddITenantConfigurationTenants) { foreach (var tenantId in tenantConfigurations.Select(i => i.TenantId.ToString())) { if (!_options.Tenants.ContainsKey(tenantId)) { _options.Tenants.Add(tenantId, null); } } } foreach (var kvp in _options.Tenants) { var tenantConfiguration = tenantConfigurations.FirstOrDefault(i => i.TenantId.ToString() == kvp.Key); var actionBuilder = new ConfigurationActionBuilder(); var tenantServices = new ServiceCollection(); var defaultBuilder = new TenantBuilder(kvp.Key); foreach (var ConfigureTenantsDelegate in _options.ConfigureTenantsDelegates) { ConfigureTenantsDelegate(defaultBuilder); } var tenantBuilder = new TenantBuilder(kvp.Key); if (kvp.Value != null) { kvp.Value(tenantBuilder); } var options = new TenantBuilder(kvp.Key) { ConfigureAppConfigurationDelegate = (context, builder) => { defaultBuilder.ConfigureAppConfigurationDelegate(context, builder); tenantBuilder.ConfigureAppConfigurationDelegate(context, builder); if (tenantConfiguration != null) { tenantConfiguration.ConfigureAppConfiguration(context, builder); } }, ConfigureServicesDelegate = (context, services) => { defaultBuilder.ConfigureServicesDelegate(context, services); tenantBuilder.ConfigureServicesDelegate(context, services); if (tenantConfiguration != null) { tenantConfiguration.ConfigureServices(context, services); } }, InitializeDbAsyncDelegate = async(sp, cancellationToken) => { await defaultBuilder.InitializeDbAsyncDelegate(sp, cancellationToken); await tenantBuilder.InitializeDbAsyncDelegate(sp, cancellationToken); if (tenantConfiguration != null) { await tenantConfiguration.InitializeDbAsync(sp, cancellationToken); } }, InitializeAsyncDelegate = async(sp, cancellationToken) => { await defaultBuilder.InitializeAsyncDelegate(sp, cancellationToken); await tenantBuilder.InitializeAsyncDelegate(sp, cancellationToken); if (tenantConfiguration != null) { await tenantConfiguration.InitializeAsync(sp, cancellationToken); } } }; foreach (var hostName in defaultBuilder.HostNames) { _options.HostMappings.Add(hostName, kvp.Key); } foreach (var hostName in tenantBuilder.HostNames) { _options.HostMappings.Add(hostName, kvp.Key); } var tenantConfig = TenantConfig.BuildTenantAppConfiguration(config, hostingEnvironment, kvp.Key, options.ConfigureAppConfigurationDelegate); tenantServices.AddSingleton(tenantConfig); var builderContext = new TenantBuilderContext(kvp.Key) { RootServiceProvider = serviceProvider, Configuration = tenantConfig, HostingEnvironment = hostingEnvironment }; options.ConfigureServicesDelegate(builderContext, tenantServices); actionBuilder.Add(b => b.Populate(tenantServices)); mtc.ConfigureTenant(kvp.Key, actionBuilder.Build()); } }