Хобрук: Ваш путь к мастерству в программировании

переопределить объект spring.net в нескольких файлах конфигурации

Я настраиваю свои файлы конфигурации xml для своего веб-приложения asp.net с помощью инъекции зависимостей spring.net IOC. Я сослался на каждый из моих файлов конфигурации в web.config. Пример настройки в файле конфигурации spring.net (settings.xml):

<object id="obj1"
      type="NS.Common.Cache.Class, NS.Common"
      singleton="true"
      init-method="Initialize"
      destroy-method="Dispose">
  <property name="Name" value="My Name" />
</object>

Все работает нормально.

Теперь я устанавливаю свое веб-приложение в нескольких средах, поэтому я создаю файл конфигурации spring.net для среды, например. dev, qa, prod.

Поэтому при установке приложения соответствующий файл Spring среды указывается в файле web.config. Это часть автоматического установщика.

В файле среды qa я хочу переопределить объект выше "obj1" на:

<object id="obj1"
    type="NS.Common.Cache.Class2, NS.Common"
    singleton="true"
    init-method="Initialize"
    destroy-method="Dispose">
  <property name="Name" value="My New Name" />
</object>

Однако, поскольку это автоматизировано (добавление ссылки на файл среды), файл settings.xml не изменяется.

И теперь ссылка на 2 файла с определенным объектом с тем же идентификатором - это вызывает серьезные проблемы, поскольку будут возникать ошибки времени выполнения.

Есть ли способ, которым я могу включить в qa.xml и флаг или тому подобное, чтобы выделить это определение объекта, переопределяющее любые другие определенные объекты в любом другом XML-файле с тем же идентификатором объекта?


  • Вы можете загрузить два идентичных идентификатора, и это переопределит первый указанный объект (перед созданием, AFAIK они должны быть в разных файлах, имея на них ссылку через ‹context ...› ‹resource ...›. Из-за этого это хороший Попрактикуйтесь включать ваши ресурсы контекста в порядке, начиная с глобального значения до локального значения (имея app.config ‹resource uri = config: // spring / objects /› в последней записи). 09.03.2012
  • @Stegi: почему бы не дать это в качестве ответа? Похоже, это решает проблему OP. 09.03.2012
  • В одиночном XML-файле id можно указать только один раз. Атрибут id на самом деле является атрибутом xml, поэтому синтаксический анализатор xml дает вам дополнительную проверку как в Visual Studio, так и при загрузке файла во время выполнения. Но, как упоминает Стеги, вы можете указать объект с одним и тем же идентификатором в разных файлах, загружаемых одним и тем же контекстом. Определение из последнего загруженного файла отменяет любые предыдущие определения с тем же идентификатором. 09.03.2012

Ответы:


1

Вы можете загрузить два идентичных идентификатора, и последний идентификатор будет «переопределять» первый объект в списке (перед созданием они должны находиться в разных файлах, имея на них ссылку в определении контекста).

<context ...>
   <resource ... /> <!-- put your 3rd-party (read-only config here) -->
   <resource ... /> <!-- put your override ids here -->
</context>

Из-за этого поведения по умолчанию рекомендуется включать ваши ресурсы контекста в порядке, начиная с «глобального значения» (например, сторонние конфигурации, которые вы хотите использовать повторно) до «локального значения» (имея app.config в качестве последней записи).

14.03.2012

2

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

Например. ты мог бы иметь

<object name="ProdObj1" type="NS.Common.Cache.Class, NS.Common" singleton="true">
  <property name="Name" value="Prod" /> 
</object>

и

<object name="TestObj1" type="NS.Common.Cache.Class, NS.Common" singleton="true">
  <property name="Name" value="Test" /> 
</object>

а затем используйте

<alias name="ProdObj1" alias="obj1"/>

например, в вашем файле web.config.

23.08.2011
  • Это будет работать, только если вы можете изменить settings.xml, а именно переименовать obj1 в ProdObj1. Из вопроса я понимаю, что OP хочет избежать именно этого. Таким образом, это может быть полезным методом - на самом деле, он может быть подходящим вариантом для сценария OP - но для этого потребуется изменить settings.xml. 23.08.2011
  • как вы имеете в виду изменение settings.xml? 23.08.2011
  • Ваш сценарий, как я его понимаю: из вашего первого абзаца я прочитал, что obj1 определяется в файле settings.xml right? этот файл настроек развернут в вашей среде проверки качества и в производственной среде. И в qa, и в production вы ссылаетесь на settings.xml, который (по неуказанной причине) вы не можете изменить. Таким образом, как в production, так и в qa, obj1 - это объект, определенный в settings.xml. 24.08.2011
  • Этот метод псевдонима хорош, но вам придется изменить файл settings.xml, а именно удалить определение obj1. Вы можете определить ProdObj1 в production.xml и TestObj1 в qa.xml. Добавив псевдоним, как предлагает Андреас, вы по-прежнему сможете использовать ссылку obj1 в контейнере - также в settings.xml. 24.08.2011
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..