Вопрос

У меня возникли трудности с управлением конфигурацией 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 для управления ключами конфигурации.

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