swi*_*obt 6 .net configuration configurationmanager connection-string spring.net
我有一个要求,要求我使用Spring.net来获取存储在app.config中的连接字符串,然后将检索到的连接字符串注入实例化对象.
我怎么能用Spring.net的xml配置呢?
例如,而不是我的代码执行此操作:
// 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>
Run Code Online (Sandbox Code Playgroud)
// Codes:
public class MyService {
public MyService(string connectionName) {
var connectionString = ConfigurationManager.AppSettings[connectionName];
// use connectionString to create a DB connection, etc
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这样:
// 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>
Run Code Online (Sandbox Code Playgroud)
// Codes:
public class MyService {
public MyService(string connectionString) {
// use connectionString to create a DB connection, etc
}
}
Run Code Online (Sandbox Code Playgroud)
甚至可以ConfigurationManager.AppSettings[..]从Spring.net xml配置调用?
在过去,我使用了一个表达来实现这一点,但通过这个问题和bbaia的回答,我发现更好的方法是使用a VariablePlaceholderConfigurer.当你使用VariablePlaceholderConfigurer而不是我的"表达式黑客"时,你不会将自己绑定到appSettings / connectionStrings变量的样式配置:你可以切换到VariableSourcesspring.net提供的一个,甚至可以实现自己的变量IVariableSource.
外的开箱,Spring.NET提供VariablePlaceholderConfigurers到检索标准的.NET设置变量,如AppSettings,ConnectionStrings,UserSettings和ApplicationSettings.bbaia的回答部分说明了这一点,您将在下面找到一个完整的例子.
ConfigurationManager从xml配置调用所以,我不建议你使用它,但这是我过去使用的hack,应用于你的配置:
<object object name="myService" type="com.acme.MyService, com.acme">
<constructor-arg name="Connection"
expression="T(System.Configuration.ConfigurationManager).ConnectionStrings['myConnectionName']" />
</object>
Run Code Online (Sandbox Code Playgroud)
您可以使用相同的方法ConfigurationManager.AppSettings,例如:
<object object name="myService" type="com.acme.MyService, com.acme">
<constructor-arg name="AnotherConstructorArgument"
expression="T(System.Configuration.ConfigurationManager).AppSettings['mySetting']" />
</object>
Run Code Online (Sandbox Code Playgroud)
VariablePlaceholderConfigurer:引用Spring.NET xml配置中的.NET设置您可以轻松地配置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>
Run Code Online (Sandbox Code Playgroud)
它从这里读取设置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>
Run Code Online (Sandbox Code Playgroud)
这些配置来自github上的这个工作样本.