переопределить объект spring.net в нескольких конфигурационных файлах - PullRequest
7 голосов
/ 22 августа 2011

Я настраиваю свои файлы конфигурации xml для моего веб-приложения asp.net, используя инъекцию зависимостей IOC Spring.net.Я ссылался на каждый из моих конфигурационных файлов в 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-файле с таким же идентификатором объекта?

Ответы [ 2 ]

6 голосов
/ 14 марта 2012

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

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

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

1 голос
/ 23 августа 2011

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

Например, вы можете иметь

<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.

...