从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 &提醒我这个原因)

从app.config中获取某些属性而不循环

我会考虑这里的"设置注入" -类似于依赖注入,但对于设置:)

假设你的入口点配置了整个系统…所以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,而包装器使用您拥有的任何配置。配置或模拟,您也可以拥有用于测试的模拟产品)。上面的代码是大型系统的一部分,只是为了提供示例,不要太字面化。