52
votes

I want to create 3 AppSettings config files:

  • Database.config
  • Messages.config
  • Global.config

And after add in my App.config:

<appSettings file="Database.config" />
<appSettings file="Messages.config" />
<appSettings file="Global.config" />

But when I try to access a key that there is in one of three files with the ConfigurationManager, I got the following error:

Configuration system failed to initialize. Sections must only appear once per config file.

I cannot have more than one AppSettings config file?

2
Define different config sections, why you want add extra files? appconfig file is one for all of running projects root.Saeed Amiri
Most readable to final user that 'll change some values. Only one file, i'll have a big file, and i don't want it.Vinicius Ottoni
You could also use some xml file to do your configuration, but config file with 200-300 lines of code is not bad;)Saeed Amiri

2 Answers

56
votes

You can't have more than one appsettings because that's the name of a section. You can add a new section though that uses the same kind of section definition as appsettings. E.g.,

<configuration>
    <configSections>
        <section name="DatabaseConfig" type="System.Configuration.NameValueFileSectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </configSections>
    ....
    <DatabaseConfig>
       <add key="Whatever" value="stuff"/>
    </DatabaseConfig>
</configuration>
44
votes

Code for separate file:

Web.config:

<configSections>
    <section name="DatabaseConfig" type="System.Configuration.NameValueFileSectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <section name="MessageConfig" type="System.Configuration.NameValueFileSectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <section name="GlobalConfig" type="System.Configuration.NameValueFileSectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>

<DatabaseConfig configSource="database.config">
</DatabaseConfig>

<MessageConfig configSource="message.config">
</MessageConfig>

<GlobalConfig configSource="global.config">
</GlobalConfig>

database.config:

<DatabaseConfig>
  <add key="Name" value="ServerName" />
</DatabaseConfig>

etc...

Can be accessed via code like this:

var databaseConfiguration = (NameValueCollection)ConfigurationManager.GetSection("DatabaseConfig");
string name = databaseConfiguration["Name"];