Как использовать переменные статических констант в качестве входных данных для списков в Spring IOC - PullRequest
2 голосов
/ 03 августа 2011

Вот что мне нужно сделать .....

У меня есть список необходимых зависимых сервисов.Для примера, давайте назовем их ServiceA, ServiceB и ServiceC.Мне нужно иметь возможность определить любую перестановку этих сервисов в моем файле конфигурации Spring.Так, например, у меня может быть

<constructor-arg name="requiredServices">
  <list element-type="string">
    <value>ServiceA</value>
    <value>ServiceB</value>
  </list>
</constructor-arg>

Это будет означать, что мне нужны службы A и B. Моя проблема в том, что я использую локальные строки в файле Spring для ссылки на ServiceA и ServiceB, когда я будугораздо лучше использовать общесистемные постоянные имена для ServiceA и ServiceB.Итак, я думаю, что я хотел бы видеть это

<constructor-arg name="requiredServices">
  <list element-type="string">
    <value>MyStringConstantsFile.ServiceA</value>
    <value>MyStringConstantsFile.ServiceB</value>
  </list>
</constructor-arg>

Тогда, если мы когда-нибудь переименуем ServiceA, файл spring.config все равно будет работать правильно.

Ответы [ 3 ]

4 голосов
/ 17 августа 2011

Используя выражение Spring , ваша конфигурация может выглядеть следующим образом:

<object id="myObject" type="q6932134.ServiceClient, q6932134">
  <constructor-arg name="requiredServices">
    <list element-type="string">
      <expression value="MyConstants.ServiceA" />
      <expression value="MyConstants.ServiceB" />
    </list>
  </constructor-arg>
</object> 

Это очень близко подходит к желаемой конфигурации в вашем вопросе: -)

Длячтобы это работало, вам нужно зарегистрировать ваш тип MyConstants с пружиной;поместите следующий код где-нибудь в вашей основной программе:

TypeRegistry.RegisterType("MyConstants", typeof(MyConstants));

Следующая альтернативная конфигурация позволяет вам использовать ссылку на объект, почти так же, как в вашем собственном ответе.Это делает конфигурацию более многословной, но имеет то преимущество, что ваши файлы конфигурации становятся менее чувствительными к переименованию ваших констант в коде:

  <object id="svca" type="string">
    <constructor-arg expression="MyConstants.ServiceA" />
  </object>
  <object id="svcb" type="string">
    <constructor-arg expression="MyConstants.ServiceB" />
  </object>

  <object id="myObject" type="q6932134.ServiceClient, q6932134">
    <constructor-arg name="requiredServices">
      <list element-type="string">
        <ref object="svca" />
        <ref object="svcb" />
      </list>
    </constructor-arg>
  </object> 

Если вам не нравится регистрировать вашу MyConstants программно, вы можетеизмените выражение следующим образом:

<constructor-arg expression="T(MyNamespace.MyConstants).ServiceA" />
1 голос
/ 04 августа 2011

Это заняло немного стука, но я получил то, что мне было нужно. Вам нужно решить проблему в два этапа.

Сначала добавьте запись в свой конфигурационный файл Spring для каждой константы, которую вы хотите использовать. Моя выглядит так

<object id="serverAName"
        type="Spring.Objects.Factory.Config.FieldRetrievingFactoryObject, Spring.Core">
  <property name="TargetType" value="CoreNamespace.ConstantsClass, CoreLibrary"/>
  <property name="TargetField" value="ServerAName"/>
</object>

Итак, в сборке с именем CoreLibrary у меня есть класс с именем ConstantsClass, который существует в пространстве имен CoreNamespace.

Затем, если я хочу использовать эту константу в качестве входных данных для списка, я просто добавляю следующую строку в конфигурационный файл spring

<property name="RequiredComponents">
  <list element-type="string">
    <ref object="serverAName"/>
  </list>
</property>
0 голосов
/ 04 августа 2011

Я не знаю, поддерживает ли Spring это прямо из коробки, но вы могли бы прочитать их с отражением в коде объекта, который вы строите.

Или создайте парсер, подобный помощнику, и вместо назначения списка строк вы можете назначить список этих ссылок, хотя определение xml будет более многословным, чем сейчас.

НТН

...