从app.config中获取某些属性而不循环
本文关键字:属性 循环 app config 获取 | 更新日期: 2023-09-27 18:05:50
我需要你的帮助
我有这样的app.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
...
</configSections>
<connectionStrings>
...
</connectionStrings>
<appSettings />
<userSettings>
<MySettings>
<setting name="Precision" serializeAs="String">
<value>0</value>
</setting>
</MySettings>
</userSettings>
<applicationSettings>
...
</applicationSettings>
</configuration>
我需要的是得到"精度"值。如何在不循环SectionGroups和SectionCollection的情况下得到这个?
注意:我有DAL,在我的DAL中需要这种精度来格式化十进制值,精度由用户(客户端)通过表示层管理。我将精度值保存在app.config中。问题是,app.config在表示层,我不能使用Properties.MySetting.Default.Precision来获得它。(感谢Branko &提醒我这个原因)
我会考虑这里的"设置注入" -类似于依赖注入,但对于设置:)
假设你的入口点配置了整个系统…所以get it从app.config中读取所有设置,并在创建和配置DAL(以及其他需要设置的地方)时使用这些设置。唯一需要知道如何使用app.config的代码可以是入口点。其他的都可以通过poco,单独的构造函数参数等来指定。
这在几个方面都很好:
- 你的代码将更容易测试:测试不同的设置,只需传递不同的构造函数参数。不需要文件等当前的问题解决了:DAL不再需要查看设置文件
- 你把你的配置存储隔离在一个地方,如果你决定(比如说)使用不同的XML格式,或者一个"ini"风格的配置格式,这个地方可以改变
如果我理解正确的话,Jon的回答是这样的:
public interface IConfigurationWrapper
{
IDictionary<string, string> Properties { get; }
T GetSection<T>(string name) where T : ConfigurationSection;
}
public class ConfigurationWrapper : IConfigurationWrapper
{
// implementation with with ConfigurationManager.GetSection or just placeholders
}
public interface IProduct
{
string Name { get; }
}
public class Product : IProduct
{
readonly IConfigurationWrapper m_configuration;
public Product(string key, IConfigurationWrapper configuration)
{
m_configuration = configuration;
}
public string Name
{
get { // use m_configuration to get name from .config }
}
}
public class ProductFactory
{
readonly IConfigurationWrapper m_configuration;
public ProductFactory(IConfigurationWrapper configuration)
{
m_configuration = configuration;
}
public IProduct CreateProduct(string key)
{
return new Product(key, m_configuration);
}
}
的用法如下:
var config = new ConfigurationWrapper();
var factory = new ProductFactory(config);
var product = factory.CreateProduct("myproductkey");
客户端只使用IProduct接口,"产品"层使用iconfigationwrapper,而包装器使用您拥有的任何配置。配置或模拟,您也可以拥有用于测试的模拟产品)。上面的代码是大型系统的一部分,只是为了提供示例,不要太字面化。