Мы выполняем сложную систему, записанную в C#.NET 3.5, состоя из 20 + веб-сайты, 10 + сервисы окон и различные запланированные задачи и вспомогательные приложения.
Каждый из них связывается одним или несколькими из нашей платформы и DLL бизнес-логики. Они DLL имеет обширные настройки конфигурации, и это превратилось в кошмар, где мы поддерживаем более чем 40 файлов конфигурации для нескольких экземпляров тех же библиотек классов.
Мы не регистрируем наш DLL в GAC по различным причинам: 1) Нам нравится гибкость быстрого развертывания изменений в выборочных проектах, не восстанавливая целую систему или вызывая ненужное время простоя. 2) Некоторые экземпляры DLL требуют немного отличающихся конфигураций; например, некоторые проекты используют различные строки подключения, адреса электронной почты уведомления и так далее.
Мы экспериментировали с атрибутами AppSettings file/configSource в Web.config/App.config, но они только работают с относительными путями, не через проекты. Мы рассмотрели сохранение значений по умолчанию в machine.config, но это - миссия, будучи слишком нарушен и полный важного материала, не связанного с нашими проектами.
Наше текущее "решение" состоит в том, чтобы использовать наш собственный формат файла конфигурации, который сначала проверяет на конфигурацию в папке "мусорного ведра" текущего проекта, и если это не существует, это загружается от трудно кодированного центрального расположения. Это позволяет нам переопределять настройки, когда необходимый, но используют остальную часть настроек по умолчанию времени.
В конечном счете то, что мы хотим, должно иметь каждую библиотеку классов настройки по умолчанию в центральной части, и затем каждый экземпляр мог иметь дополнительный файл конфигурации, который только переопределяет те настройки, которые отличаются от значения по умолчанию.
Существует ли предложенный, промышленный стандарт способ решить эту проблему в.NET?
Если это все в одной компании, почему бы вам просто не сохранить конфигурации в базе данных? Я считаю, что в Enterprise Framework даже есть адаптеры, которые вы можете подключить именно для этого.
Я знаю, что в нашей компании, поскольку у нас были сайты, работающие на веб-фермах, мы сохраняли конфигурацию в базе данных, а затем, если нам нужно было что-то изменить, мы должны были обновить конфигурацию сценарием базы данных. не нужно нажимать на сайты, просто нужно было перезапустить сайт или коснуться web.config, чтобы принудительно перезагрузить.
Другое решение, которое у нас было для других элементов, заключалось в использовании базы данных, в которой размещались пары ключ-значение вместе с другими типами данных конфигурации, чтобы мы также могли легко изменять вещи в наших проектах веб-сайтов / форм Windows, которые использовали те же компоненты.
Итак, я предполагаю, что я говорю, если все они находятся в одной компании / сфере влияния, так что вы можете использовать базу данных, которая является центральной для них всех, просто используйте БД.
Не загрязняйте реестр.
, я бы использовал OpenExeConfiguration (http://msdn.microsoft.com/en-us/library/ms224437.aspx) и имел бы каждый open 2 конфигурационных файла app/dll, первый - по умолчанию, второй - по переопределению.
Вы можете хранить настройки по умолчанию в этом "центральном" месте, предоставляя доступ на чтение всем вашим приложениям, и иметь локальные конфигурации рядом с вашими приложениями.
Как вы развертывали эти веб-сайты и приложения, работали ли эти модули в вашей системе в на той же машине, и вызывали ли эти модули библиотеки DLL из определенного каталога?
Если на той же машине вы можете использовать файл конфигурации, если в серверной ферме вам может понадобиться база данных, как говорил ранее Джошуа.
Если вам просто нужно переопределить какой-либо раздел конфигурации в общем файле конфигурации, вы можете сначала загрузить свои настройки по умолчанию из центрального расположения, а затем загрузить свою конкретную конфигурацию в каждый проект, а затем изменить объект конфигурации во время выполнения.