Как мне управлять конфигурацией приложения в ASP.NET?
-
21-09-2019 - |
Вопрос
У меня возникли трудности с управлением конфигурацией ASP.Сетевое приложение для развертывания для разных клиентов.Огромное количество различных настроек, которые необходимо изменить, отнимает много времени, а текущие методы настройки слишком сложны, чтобы мы могли переложить эту ответственность на партнеров по поддержке.
Есть какие-либо предложения по улучшению методов решения этой проблемы или хорошим источникам информации для исследования?
Как мы работаем в настоящее время:
- Различные файлы конфигурации XML, на которые есть ссылки в Web.Config, например AppSettings.xml .
- Конфигурации для определенных сайтов хранятся в дублирующихся файлах конфигурации.
- Текстовые файлы, содержащие списки данных, специфичных для сайта
- В некоторых случаях ручные одноразовые изменения в базе данных
- Конфигурация C # для Windsor IOC.
Конкретные проблемы, с которыми мы сталкиваемся:
- Разные сайты с включенными разными функциями, разные внешние службы, с которыми нам приходится общаться, и разные бизнес-правила.
- Различные типы развертывания (оперативное, тестовое, обучающее)
- Ключи конфигурации меняются в разных версиях (получить добавленные, удалить), что означает, что мы должны обновить все дублирующиеся файлы
- Нам все еще нужно иметь возможность изменять ключи во время работы приложения
Наши текущие мысли о том, как мы могли бы подойти к этому, таковы:
- Переместите конфигурацию в динамически скомпилированный код (возможно, Boo, Binsor или JavaScript).
- Иметь некоторую форму конфигурации различия / слияния:объедините конфигурацию по умолчанию с конфигурацией live / test / training и конфигурацией для конкретного сайта
Решение
Какой бы путь вы ни выбрали, я думаю, что было бы полезно иметь понятие единого «источника истины» для вашей конфигурации.
Дублирование допустимо, если вам нужно предоставить конфигурацию некоторым компонентам в их собственной специализированной форме.
Но чтобы сохранить здравомыслие, я думаю, вам следует постараться иметь одно место, где вы устанавливаете всю конфигурацию, относящуюся к вашему приложению, а затем четко определенный механизм для перевода ее в записи внутри Web.config и любой другой механизм конфигурации, который вы можете использовать. придется поддержать.
В зависимости от уровня квалификации ваших партнеров по поддержке (независимо от того, будут ли они ломать XML), я полагаю, вы также можете предоставить утилиту с графическим интерфейсом, позволяющую им крутить все ручки в этом файле конфигурации «источника истины», с помощью « Примените» и запустите код преобразования/обновления, чтобы внести необходимые изменения в Web.config и его друзья.
Затем, чтобы управлять конфигурацией для разных сайтов/клиентов, теоретически вам нужно управлять одним файлом конфигурации.
Примечание: В ASP.NET 4.0 будет доступен механизм преобразования конфигурации во время сборки (см. http://blog.hmobius.com/post/2010/02/17/ASPNET-40-Part-4-Config-Transformation-Files.aspx), что может облегчить эту задачу.Похоже, вы можете использовать это с некоторыми хаками для не веб-проектов (см. http://philbolduc.blogspot.com/2010/03/using-config-transforms-outside-web.html).
Однако, если вам нужно внести эти изменения во время развертывания, вы можете застрять в написании собственных инструментов для этого, хотя похоже, что преобразования XDT могут быть для вас подходящим вариантом, если вы хотите иметь возможность добавлять/ обновить/удалить элементы.
Другие советы
Если код, использующий указанные элементы конфигурации, является кодом, которым вы управляете / можете изменять (и все они выполняются в пространстве управляемого кода / C #), я бы хотел перенести вызовы методов, которые получают настройки для вызова, в класс, подобный singleton, по крайней мере, с методом getString() в нем.
GetObject() может быть очень полезен (ознакомьтесь с материалами по сериализации .Net XML - американцы пишут это через "z":сериализация) ...полезно для большого количества материалов, но также и потому, что это означает, что вы можете начать упаковывать связанные элементы конфигурации в отдельные позиции в магазине.
Что касается использования единого хранилища (таблицы базы данных с кэшированным доступом) или использования вашего нового фасада конфигурации только для инкапсуляции того, где хранятся элементы конфигурации, - это зависит от вас ...Я настоятельно предпочитаю использовать для настройки один магазин для каждого развертывания продукта, потому что тогда вы всегда точно знаете, где искать и где вносить изменения.Все ссылки на веб-службы (WCF или другие) могут быть сконструированы и вызваны с использованием строк, предоставленных во время выполнения...:)
Что касается значений кэширования для ключей - я использую свой собственный кэш в памяти (для небольших приложений), потому что накладные расходы на стек управляемы...здесь могут работать такие вещи, как memcache (доступ к хранилищу конфигурации осуществляется через TCP / где-то в сети)...
Редактировать Что -то вроде:
public class ConfigurationStore
{
private static ConfigurationStore _instance = null;
public static ConfigurationStore Instance {
get {
if(_instance == null)
{
_instance = new ConfigurationStore();
}
return _instance;
}
}
public string GetValue(string key)
{
....
}
public Object GetObject(string key)
{
...
}
}
Вы можете рассмотреть возможность использования сценариев NAnt для автоматизации в сочетании с какой-либо специальной утилитой .net для управления ключами конфигурации.