Esempio n. 1
0
        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());
                }
            }