Как я могу заставить библиотеку классов .NET читать свой собственный файл конфигурации? - PullRequest
17 голосов
/ 18 марта 2011

У меня есть библиотека классов .NET, которая предоставляет набор вспомогательных функций, которые используются несколькими веб-службами. Эта библиотека классов должна хранить один параметр, а именно строку подключения, которую сами веб-службы не должны видеть, поскольку все они должны запрашивать одну и ту же базу данных.

К сожалению, .NET не предоставляет средств для простого чтения файла app.config DLL. Единственное «простое» решение - хранить строку подключения в каждом файле конфигурации веб-службы , который полностью запутан.

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


РЕДАКТИРОВАТЬ: Технически, я мог бы объединить все эти веб-службы в одну веб-службу. Но по деловым причинам (каждая веб-служба будет продаваться отдельно), я не могу этого сделать.

Ответы [ 7 ]

10 голосов
/ 27 марта 2012

Год известен, но я использовал этот метод для чтения каждой из настроек:

Configuration config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
ConfigurationSectionGroup csg = config.GetSectionGroup("applicationSettings");
ClientSettingsSection c = (ClientSettingsSection)csg.Sections["Add your section name here, e.g. Your.Namespace.Properties.Settings"];
foreach (SettingElement e in c.Settings)
{
    Debug.WriteLine("SETTING NAME: " + e.Name);
    SettingValueElement v = e.Value;
    Debug.WriteLine("SETTING VALUE: " + v.ValueXml.InnerText);
}

Это работает с файлом настроек, созданным в проекте библиотеки классов.Файл настроек должен быть назван «YourLibrary.dll.config», а затем развернут в расположении библиотеки.Файл настроек должен иметь содержимое, аналогичное следующему:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="Your.NameSpace.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <Your.NameSpace.Properties.Settings>
      <setting name="YourLibrary_WebReferences_YourWebService" serializeAs="String">
        <value>http://localhost:3861/YourWebService.asmx</value>
      </setting>
      <setting name="AnotherSetting" serializeAs="String">
        <value>False</value>
      </setting>
    </Your.NameSpace.Properties.Settings>
  </applicationSettings>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

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

Причина, по которой мне нужно было это сделать, заключается в том, что у меня есть пользовательский элемент управления, который оборачивает библиотеку ActiveX / COM, которая затем размещается в IE, в тег «object».У меня есть работающие теги «param», поэтому я мог бы использовать этот механизм для передачи настроек в пользовательский элемент управления, но в то время этот метод казался логичным выбором.К тому же я не позволил этой конкретной проблеме победить меня!

HTH pridmorej:)

5 голосов
/ 18 марта 2011

Я думаю, что вы ищете:

ConfigurationManager.OpenExeConfiguration(string exePath)

или

ConfigurationManager.OpenMappedExeConfiguration(
    new ExeConfigurationFileMap() { 
        ExeConfigFilename = path + "app.config" 
    }, ConfigurationUserLevel.None);

, который возвращает объект Configuration. Документ MSDN о ConfigurationManager

Попробуйте этот вопрос , чтобы узнать, как получить путь к DLL.

2 голосов
/ 28 марта 2017

ConfigurationManager.OpenExeConfiguration не работал для меня.

Но, Properties.Settings.Default.<SettingName> работал хорошо.

2 голосов
/ 17 октября 2013

Этот тип проблемы конфигурации довольно легко решается с помощью Enterprise Library" общих источников конфигурации " и " дифференциальных конфигураций " (для простого переключения между несколькими средами и т. д.).

Чтобы узнать о сценариях расширенной настройки , попробуйте начать здесь:

http://msdn.microsoft.com/en-us/library/ff664552(v=pandp.50).aspx

А чтобы интегрировать Средство настройки корпоративной библиотеки (GUI) в Visual Studio , попробуйте здесь:

http://visualstudiogallery.msdn.microsoft.com/029292f0-6e66-424f-8381-3454c8222f9a

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

Кстати: как только вы освоите его, вы, вероятно, в конечном итоге захотите использовать его для гораздо большего, чем просто для Строк подключения!

1 голос
/ 30 сентября 2015

Вы можете использовать библиотеку Config.Net с открытым исходным кодом, которая поддерживает несколько источников данных, включая ваш https://github.com/aloneguid/config

1 голос
/ 18 марта 2011

Будет ли возможность ссылаться на файл конфигурации библиотеки из конфигурации каждого веб-сервиса? В .NET есть механизм включения, похожий на XML:

Использовать XML включает или настраивать ссылки в app.config для включения настроек других файлов конфигурации

http://blog.andreloker.de/post/2008/06/Keep-your-config-clean-with-external-config-files.aspx

Хотя вам все еще нужно редактировать каждый файл web.config, фактический контент хранится в одном месте.

0 голосов
/ 20 мая 2011

Вы можете прочитать параметры конфигурации библиотеки классов из web.config или app.config.

хост-приложения.

Если на библиотеку классов ссылаются в консольном приложении, поместите параметры, необходимые для библиотеки классов, в app.config консольного приложения (скажем, в appSettings) и прочитайте его из библиотеки классов с помощью ConfigurationManager в System.Configuration .

Если на библиотеку классов ссылаются в веб-приложении, поместите параметры, необходимые для библиотеки классов, в web.config веб-приложения (скажем, в appSettings) и прочитайте его из библиотеки классов с помощью ConfigurationManager в System.Configuration.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...