Доступ к значению ConfigurationManager.AppSettings из конфигурации Spring.NET xml - PullRequest
6 голосов
/ 03 ноября 2011

У меня есть требование, которое требует от меня использования Spring.net, чтобы получить строку подключения, которая хранится в app.config, а затем внедрить полученную строку подключения в экземпляр объекта.

Как я могу это сделатьиспользуя конфигурацию xml Spring.net?

Например, вместо моих кодов это делается:

// Spring.net config:
<object name="myService" type="com.acme.MyService, com.acme">
    <constructor-arg type="System.String" value="myConnectionName"/>
</object>

// Web.config:
<connectionStrings>
    <add name="myConnectionName" connectionString="DB_connectionstring"/>
</connectionStrings>
// Codes:
public class MyService {
    public MyService(string connectionName) {
        var connectionString = ConfigurationManager.AppSettings[connectionName];
        // use connectionString to create a DB connection, etc
    }
}

Я хочу это так:

 // Spring.net config:
<object name="myService" type="com.acme.MyService, com.acme">
    <constructor-arg type="System.String" ref="retrievedConnectionString"/>
</object>    
// How to make a call similar to "ConfigurationManager.AppSettings[connectionName]" and get the connection string from Web.config and put inside "retrievedConnectionString"?

// Web.config:
<connectionStrings>
    <add name="myConnectionName" connectionString="DB_connectionstring"/>
</connectionStrings>
// Codes:
public class MyService {
    public MyService(string connectionString) {
        // use connectionString to create a DB connection, etc
    }
}

Можно ли даже позвонить ConfigurationManager.AppSettings[..] из конфигурации xml Spring.net?

Ответы [ 2 ]

6 голосов
/ 03 ноября 2011

В прошлом я использовал выражение для достижения этой цели, но с помощью этого вопроса и ответа bbaia я обнаружил, что лучший способ сделать это - использовать VariablePlaceholderConfigurer.Когда вы используете VariablePlaceholderConfigurer вместо моего «выражения хака», вы не привязываете себя к конфигурации ваших переменных в стиле appSettings / connectionStrings: вы можете переключиться на одну из VariableSources при условииSpring.net или даже реализовать свои собственные IVariableSource.

Стандартно. Spring.NET предоставляет VariablePlaceholderConfigurer s для извлечения переменных из стандартных настроек .NET, таких как AppSettings, ConnectionStrings, UserSettings и ApplicationSettings.Это частично иллюстрируется ответом bbaia, и вы найдете полный пример ниже.

«Взлом выражения»: вызов ConfigurationManager из xml config

Так что я не советую вамиспользуйте это, но это хак, который я использовал в прошлом, примененный к вашей конфигурации:

<object object name="myService" type="com.acme.MyService, com.acme">
  <constructor-arg name="Connection" 
                   expression="T(System.Configuration.ConfigurationManager).ConnectionStrings['myConnectionName']" />
</object>

Вы можете использовать этот же подход для ConfigurationManager.AppSettings, например:

<object object name="myService" type="com.acme.MyService, com.acme">
  <constructor-arg name="AnotherConstructorArgument" 
                   expression="T(System.Configuration.ConfigurationManager).AppSettings['mySetting']" />
</object>

VariablePlaceholderConfigurer: ссылка на настройки .NET из Spring.NET xml config

Вы можете легко настроить VariablePlaceholderConfigurer для получения переменных из стандартных настроек .NET, таких как AppSettings, ConnectionStrings, UserSettings и ApplicationSettings.Например, рассмотрим эту конфигурацию xml:

<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net" >

  <object type="Spring.Objects.Factory.Config.VariablePlaceholderConfigurer, Spring.Core">
    <property name="VariableSources">
      <list>
        <object type="Spring.Objects.Factory.Config.ConnectionStringsVariableSource, Spring.Core" />
        <object type="Spring.Objects.Factory.Config.ConfigSectionVariableSource, Spring.Core">
          <!-- Sections to read, sepearated by comma (leave out spaces) -->
          <property name="SectionNames"
                    value="appSettings,applicationSettings/q7991262.Properties.Settings,userSettings/q7991262.Properties.Settings" />
        </object>
      </list>
    </property>
  </object>

  <!-- Note that you have to append '.connectionstring' to the key! -->
  <object id="usingConnectionStringsVariableSource" 
          type="q7991262.MyService, q7991262">
    <property name="Connection" 
              value="${myConnectionName.connectionString}" />
  </object>

  <object id="configSectionVariableSource" 
          type="q7991262.MyService, q7991262">
    <property name="Connection" 
              value="${myConnectionNameAppSettings}" />
  </object>

  <object id="userSettingsSection" 
          type="q7991262.MyService, q7991262">
    <property name="Connection" 
              value="${myConectionNameUserSetting}" />
  </object>

  <object id="applicationSetting" 
          type="q7991262.MyService, q7991262">
    <property name="Connection" 
              value="${myConectionNameApplicationSetting}" />
  </object>

</objects>

Считывает настройки из этой app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="q7991262.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="q7991262.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>

  <connectionStrings>
    <add name="myConnectionName" 
         connectionString="From connection string section."/>
  </connectionStrings>

  <appSettings>
    <add key="myConnectionNameAppSettings" 
         value="From app setting section." />
  </appSettings>

  <userSettings>
    <q7991262.Properties.Settings>
      <setting name="myConectionNameUserSetting" serializeAs="String">
        <value>My connection from user settings.</value>
      </setting>
    </q7991262.Properties.Settings>
  </userSettings>

  <applicationSettings>
    <q7991262.Properties.Settings>
      <setting name="myConectionNameApplicationSetting" serializeAs="String">
        <value>My connection from application settings.</value>
      </setting>
    </q7991262.Properties.Settings>
  </applicationSettings>

</configuration>

Эти конфигурации взяты из этого рабочего примера на github .

3 голосов
/ 03 ноября 2011

Другим решением является использование VariablePlaceholderConfigurer: http://www.springframework.net/doc-latest/reference/html/objects.html#objects-variablesource

Реализация ConnectionStringsVariableSource позволяет получить значение из раздела ConnectionString в файле конфигурации.

<object type="Spring.Objects.Factory.Config.VariablePlaceholderConfigurer, Spring.Core">
  <property name="VariableSources">
    <list>
      <object type="Spring.Objects.Factory.Config.ConnectionStringsVariableSource, Spring.Core"/>
    </list>
  </property>
</object>

<object name="myService" type="com.acme.MyService, com.acme">
    <constructor-arg type="System.String" value="${myConnectionName.connectionString}"/>
</object>

Пример изФорум Spring.NET: http://forum.springframework.net/showthread.php?3961

...