Альтернативы использованию web.config для хранения настроек (для сложных решений)

StackOverflow https://stackoverflow.com/questions/306169

Вопрос

В наших веб-приложениях мы разделяем уровни доступа к данным на отдельные проекты.

Это создает некоторые проблемы, связанные с настройками.

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

Чтобы решить эту проблему, в некоторых из наших последних проектов мы представили третий проект только для настроек.Помещаем настройку в систему .Setting-файлов...С помощью простой оболочки было легко добиться возможности иметь разные настройки для разных сред (разработка, контроль качества, промежуточный этап, производство и т. д.).

Единственная проблема заключается в том, что проект настроек (включая класс .Settings) компилируется в сборку, поэтому вы не можете изменить его без выполнения сборки/развертывания, а некоторые наши клиенты хотят иметь возможность настраивать свои проекты без Visual. Студия.

Итак, есть ли для этого лучшая практика?У меня такое ощущение, что я изобретаю велосипед.

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

РЕДАКТИРОВАТЬ: Исходный вопрос не содержал действительно веской причины, по которой мы не можем (я думаю) использовать web.config...Это вырывает несколько (очень хороших) ответов из контекста, я плохой.

Это было полезно?

Решение

Разделите это. Используйте решение для хранения файлов с фиксированным XML для подключения к базе данных, зашифрованное с помощью встроенных функций шифрования .NET (не сверните свои собственные). Затем, используя полученное соединение с базой данных, найдите свою «таблицу настроек» в базе данных. Таким образом, вы можете изменить настройки без повторного развертывания. Если ваши клиенты должны иметь возможность изменять строку подключения к базе данных без Visual Studio, просто напишите небольшое приложение Windows Forms, которое способно генерировать зашифрованную строку подключения и сохранять файл хранилища с фиксированным XML и, при необходимости, также может подключаться в БД (через тот же файл) и измените таблицу настроек в соответствии с потребностями пользователя.

Другие советы

System.Configuration.ConfigurationManager.ConnectionStrings и System.Configuration.ConfigurationManager.AppSettings Содержите настройки из исполняемого приложения, чтобы в DAL вы могли получить настройки, хранящиеся в файле web.config.

Для вашей системы вы можете создать пользовательский раздел конфигурации, который будет находиться в вашем файле web.config или в файле потребителя DAL * .config. В этих файлах конфигурации вы можете указать, что они загружаются из отдельного файла конфигурации вашего дизайна и местоположения. , Ссылки на внешние файлы конфигурации из Web.Config Практическое руководство. Создание пользовательских разделов конфигурации с помощью ConfigurationSection

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

Вы можете добавить эквивалент к файлу web.config с именем app.config, который компилируется в файл с именем dll или exe-проекта вашего кода. Это полностью изменяемый без перекомпиляции. Вы можете использовать стандартные настройки для строк подключения и различные настройки приложения, которые можно определить в паре ключ / значение - или, немного потрудившись, вы можете определить свой собственный класс и раздел настроек конфигурации. Вы даже можете ссылаться на настройки в конфигурации вашего приложения - чтобы вы могли сохранить 3 настройки в вашем приложении (DEV, QA, PROD), а затем ссылаться только на те, которые вы хотите во время выполнения, в файле app.config. Вот пример того, который был создан для настройки веб-сервиса.

<? xml version = " 1.0 " & Кодировка = Quot; UTF-8 Quot &;? GT &;
л &; конфигурация GT &;
NBSP &; NBSP &; л &; configSections GT &;
& nbsp; & nbsp; & nbsp; & nbsp; < sectionGroup name = " applicationSettings " type = " System.Configuration.ApplicationSettingsGroup, System, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089 " >
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; < имя раздела = " {Project} .Properties.Settings & Quot; type = " System.Configuration.ClientSettingsSection, System, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089 " & RequirePermission = Quot; & Ложно Quot; / GT &;
NBSP &; NBSP &; NBSP &; NBSP &; л &; / sectionGroup GT &;
& nbsp; & nbsp; & nbsp; & nbsp; < имя раздела = " microsoft.web.services3 " type = " Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, версия = 3.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35 " / GT &;
NBSP &; NBSP &; л &; / configSections GT &;
NBSP &; NBSP &; л &; applicationSettings GT &;
NBSP &; NBSP &; NBSP &; NBSP &; & Лт; {} проекта .Properties.Settings GT &;
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; < имя настройки = " {SettingName} " ; & SerializeAs = Quot; Строка Quot &; GT &;
NBSP &; NBSP &; NBSP &; NBSP &; NBSP &; NBSP &; NBSP &; NBSP &; & л; & значение GT ; {SettingValue} л &; / значение GT &;
NBSP &; NBSP &; NBSP &; NBSP &; NBSP &; NBSP &; л &; / установка GT &;
NBSP &; NBSP &; NBSP &; NBSP &; & Лт; / {} проекта .Properties.Settings GT &;
NBSP &; NBSP &; л &; / applicationSettings GT &;
NBSP &; NBSP &; л &; microsoft.web.services3 GT &;
NBSP &; NBSP &; NBSP &; NBSP &; & л, безопасность GT &;
NBSP &; NBSP &; NBSP &; NBSP &; NBSP &; NBSP &; л &; securityTokenManager GT &;
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; < add type = quot; Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager, Microsoft.Web.Services3, версия = 3.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35 " namespace = " http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd & amp; quot ; LocalName = Quot & & UsernameToken Quot; / GT &;
NBSP &; NBSP &; NBSP &; NBSP &; NBSP &; NBSP &; л &; / securityTokenManager GT &;
NBSP &; NBSP &; NBSP &; NBSP &; & л; / безопасность GT &;
NBSP &; NBSP &; л &; /microsoft.web.services3 GT &;
л &; / конфигурации GT &;

Похоже, вы не понимаете, как работают web.config/app.config, если я правильно вас понял.Допустим, у вас есть структура, подобная следующей:

Проект ДАЛ

Использованная литература:

  • Некоторые основные библиотеки
  • Разные ссылки

Классы:

  • База данныхПомощник
  • ОбъектКласс1
  • ОбъектКласс2
  • и т. д...

Веб-проект

Использованная литература:

  • Некоторые основные библиотеки
  • Проект ДАЛ
  • Разные ссылки

Страницы:

  • По умолчанию.aspx
  • SomePage1.aspx
  • и т. д...
  • Веб.конфигурация

В классе DatabaseHelper вы можете ссылаться на строку подключения следующим образом:

string connString = ConfigurationManager
  .ConnectionStrings["myConnString"]
  .ConnectionString;

Когда это произойдет во время выполнения, ваш класс DatabaseHelper будет работать в том же домене приложения, что и ваша веб-страница, и, таким образом, любые вызовы ConfigurationManager будут загружать запрос из файла web.config, предоставленного веб-проектом.

Таким образом, вам нужен только один файл конфигурации в вашем web/console/winforms/etc...проект, и вам не нужно беспокоиться о том, чтобы иметь его во время разработки в каждом из ваших проектов библиотеки классов.

Если вы на самом деле запускаете свой DAL как службу или отдельное консольное приложение или что-то в этом роде, тогда и только тогда вам нужно будет предоставить проекту DAL собственный файл app.config/web.config.

Совершенно другой подход - использовать SQLite и хранить там все настройки приложения. Вы можете защитить паролем соответствующую базу данных, если это важно для приложения, и вы можете создать несколько простых таблиц свойств / значений для хранения данных.

Использование адаптера SQLite ADO потребует только 1 дополнительную DLL-библиотеку в проектах для доступа к настройкам и Сама БД SQLite была бы доступна тем, кто не хочет использовать Visual Studio. Существует даже плагин для Firefox для взаимодействия с базами данных SQLite.

Вы можете сохранить настройки в любом старом XML-файле и использовать XmlSerializer, чтобы взять свой класс и преобразовать его в < - & GT; из XML В другом ответе я написал некоторый код, который просто тот. Связанный ответ сериализует список простых объектов, но он также работает для сериализации одного большого объекта конфигурации.

Поскольку XmlSerializer сериализует в / из общедоступных свойств, если вы не хотите, чтобы значения могли изменяться, вам может потребоваться сделать сам класс неизменяемым (стиль эскимо) или иметь фасад только для чтения, который находится перед десериализованный.

Это удобный трюк. Вы можете настроить его через ConfigurationManager.AppSettings [] с его собственным разделом конфигурации и ссылками на внешние файлы, или вы можете просто жестко закодировать конкретное имя файла xml для каждого класса конфигурации.

Ознакомьтесь с Config.Net - Самый простой каркас конфигурации для разработчиков .NET .

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

У вас может быть интерфейс, который сопоставляет вам настройки, используемые в вашем DAL. Затем в приложении вы можете просто использовать IoC для передачи настроек в DAL.

Если вы используете инфраструктуру DI (например, Unity), вы можете указать аргументы конструктора. Таким образом, гипотетически, ваш поставщик DAL может иметь конструктор, который принимает строку подключения.

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

Посмотрите DslConfig . Кажется, это решает то, что вы ищете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top