The
 config file is place where common variables, database connection 
strings, web page settings and other common stuff are placed. The config
 file is also dynamic, so you can change the value of the variable in 
the config file  without compiling and deploying the .NET app. In multi 
tenancy environment config file can be complicate for deployment, 
because  for each tenant different value must be set for most of the 
defined variables. In such a situation you have to be careful to set 
right value for the right tenant.
One
 way of handling this is to hold separate config file for each tenant. 
But the problem can be variables which are the same for all tenants, and
 also the case where some variables can be omitted for certain tenant.
One
 of the solution for this can be defining external config files for only
 connection strings or appSettings variables, or any other custom config
 section. In this blog post, it will be presenting how to define 
connection strings as well as appSettings section in separate config 
file.
Lets say you have appSettings and connectionStrings config sections, similar like code below:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
	<connectionStrings>
		<add name="SQLConnectionString01" connectionString="Data Source=sourcename01;Initial Catalog=cat01;Persist Security Info=True;Integrated Security=true;"/>
		<add name="SQLConnectionString02" connectionString="Data Source=sourcename02;Initial Catalog=cat02;Persist Security Info=True;Integrated Security=true;"/>
	</connectionStrings>
	<appSettings>
		<clear />
		<!-- Here are list of appsettings -->
		<add key="Var1" value="Var1 value from config01" />
		<add key="Var2" value="Varn value from config01"/>
		<add key="Var3" value="Var3 value from main config file"/>
	</appSettings>
</configuration>
There are three appSetting keys Var1 , Var2 and Var3  and two connectionstrings in the app.config.
The
 config file above can be split in such a way that variables Var1 and 
Var2 be defined in separated file, but the Var3 can be remain in the 
main cofing file. Separate config file may be unique for each tenant.
Now the main config file looks like the following:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
	<connectionStrings configSource="config\connString01.config"/>
	<appSettings file="config\config01.config">
		
		<add key="Var3" value="Var3 value from main config file"/>
	</appSettings>
</configuration>
In the Visual Studio Solution there is config 
folder in which we created two config files for appSettings section and 
two config files for Connectionstrings section, in case we have two 
separate environments for deployments.

 The flowing code snippet shows the appSettings section implemented in the external file:
<appSettings file="appSettings.config">
	<!-- Here are list of appsettings -->
	<add key="Var1" value="Var1 value from config02" />
	<!-- ... -->
	<add key="Varn" value="Varn value from config02"/>
</appSettings>
The external config file for connection strings looks similar like the flowing:

The simple console application shows how to use this config variables in the code:
static void Main(string[] args)
{
    var var1Value= ConfigurationManager.AppSettings["Var1"];
    var var2Value = ConfigurationManager.AppSettings["Var2"];
    var var3Value = ConfigurationManager.AppSettings["Var3"];
    var conn1 = ConfigurationManager.ConnectionStrings["SQLConnectionString01"];
    var conn2 = ConfigurationManager.ConnectionStrings["SQLConnectionString02"];
    Console.WriteLine("Values from config01.config and connString01.config files");
    Console.WriteLine("Var1={0}",var1Value);
    Console.WriteLine("Var2={0}", var2Value);
    Console.WriteLine("Var3={0}", var3Value);
    Console.WriteLine("ConnStr01={0}", conn1);
    Console.WriteLine("ConnStr01={0}", conn2);
    Console.Read();
}
The complete source code can be downloaded from this link.
		    
            
	        Posted
		    
Feb 08 2016, 09:04 AM
			by
		    
Bahrudin