Несколько конфигурационных файлов: из какого из них читается процесс? - PullRequest
1 голос
/ 24 марта 2009

У меня есть решение с несколькими проектами. В каждом проекте я добавил .config файл с настройками, которые влияют на локальные настройки.

Когда я пытался прочитать настройки для соединения с базой данных, я получил некоторые значения, которые я не знаю, откуда они берутся.

Это файл .config решения DatabaseLayer:

<configuration>
<configSections>
</configSections>
<connectionStrings>
    <add name="localDBConnection"
        connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Niko\Documents\Visual Studio 2008\Projects\GaitLinkServer\DatabaseLayer\GaitLinkDB.mdf;Integrated Security=True;User Instance=True"
        providerName="System.Data.SqlClient" />
</connectionStrings>

Когда я выполнил строку

private string connectionString = ConfigurationManager.ConnectionStrings["localDBConnection"].ToString();

У меня исключение нулевого объекта ссылки. Поэтому я попытался выполнить следующую команду:

ConfigurationManager.ConnectionStrings[0]

и он вернулся

{data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true}
base {System.Configuration.ConfigurationElement}: {data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true}
ConnectionString: "data source=.\\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
Name: "LocalSqlServer"
ProviderName: "System.Data.SqlClient"

Который не знает, откуда он.

Я был бы очень признателен, если бы кто-нибудь мог показать, как создать глобальный файл .config для решения с несколькими проектами и как связать локальные файлы (Project) .config.

Спасибо!

Ответы [ 4 ]

1 голос
/ 24 марта 2009

Как примечание, если вы используете ApplicationSettings, свойства получают значения по умолчанию из любого файла App.Config, который был частью этого конкретного проекта. Вы можете указать параметры приложения в запущенном приложении, которое переопределит значения по умолчанию.

Объяснить ..

У меня есть проект с именем CatalogData. Используя экран свойств проекта / вкладку «Настройки», я добавил свойство test с значением test.

Файл конфигурации приложения содержит

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

...

<configSections>
    <sectionGroup name="userSettings" 
     type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    >
        <section name="CatalogModel.Properties.Settings"
         type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
         allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
</configSections>

<userSettings>
    <CatalogModel.Properties.Settings>
        <setting name="test" serializeAs="String">
            <value>test</value>
        </setting>
    </CatalogModel.Properties.Settings>
</userSettings>

...

</configuration>

Код, сгенерированный для чтения настроек (сделайте его доступным через My.Settings.test для VB.NET или следующим образом в C #

CatalogModel.Properties.Settings s = new CatalogModel.Properties.Settings();
string test = s.test;

Получает значение по умолчанию в сгенерированном коде, что фактически делает файл app.config ненужным для развертывания, если скомпилированные параметры в порядке.

В этом фрагменте вы можете видеть атрибут, который дает значение по умолчанию, которое компилируется.

...
    [global::System.Configuration.DefaultSettingValueAttribute("test")]

    public string test {
        get {
            return ((string)(this["test"]));
        }
    }
1 голос
/ 24 марта 2009

Данный AppDomain (на самом деле не процесс) всегда считывает данные конфигурации из одного файла. По умолчанию это applicationname .EXE.CONFIG для настольного приложения или web.config для приложения asp.net. Нет .DLL.CONFIG никогда не используется. Вам нужно будет скопировать любые настройки из такого файла в файл реальной конфигурации.

0 голосов
/ 24 марта 2009

Одна вещь, не упомянутая в ответах на данный момент, заключается в том, что любая сборка, запущенная в приложении ASP.NET или WinForms, распознает web.config / app.config приложения через ConfigurationManager. Итак, как и предполагалось, когда вы помещаете информацию о конфигурации в файл конфигурации приложения, сборки, используемые в приложении, могут считывать эти значения. Единственное, что вам нужно сделать (и задокументировать как хорошую практику), это убедиться, что в конфигурации app / web есть именованный элемент, которого ожидает .DLL.

Например, у вас есть .DLL в приложении WinForms, которое ожидает, что приложение, в котором находится .DLL, будет иметь запись с именем «MyAppConn». Код вашей DLL будет использовать:

Dim cs as String = ConfigurtionManager.ConnectionStrings("MyAppConn").ToString

DLL может использоваться во многих различных хостинговых приложениях, и пока MyAppConn определен в файле .config хостингового приложения, DLL будет получать строку подключения. При желании MyAppConn может указывать на разные базы данных в каждом хостинговом приложении.

0 голосов
/ 24 марта 2009

Все ваши настройки конфигурации должны быть указаны в app.config (или web.config) для исполняемого проекта (вашего консольного приложения, веб-сайта и т. Д.).

Если вы поместите параметры конфигурации в app.config для проекта библиотеки (DLL), они не будут найдены. Вам нужно скопировать все настройки в .config для исполняемого файла. Или вы можете возиться с действием сборки для вашего проекта DLL app.configs, а затем попытаться ссылаться на них из исполняемого файла app.config. Обычно проще всего поместить все настройки в одном месте.

...