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

时间:2011-08-18 02:54:52

标签: c# .net loops app-config data-access-layer

我需要你的帮助

我有像这样的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位于Presentiation Layer中,我不能使用Properties.MySetting.Default.Precision来获取它。 (感谢Branko&Tim提醒我这个原因)

2 个答案:

答案 0 :(得分:1)

我会在这里考虑“设置注入” - 比如依赖注入,但对于设置:)

大概是你的入口点配置整个系统......所以让 it 从app.config中读取所有设置,并在创建和配置DAL时使用它们(以及其他需要设置的地方) )。需要知道如何使用app.config的唯一代码可以是入口点。其他所有内容都可以通过POCO,单独的构造函数参数等来指定。

这在很多方面都很好:

  • 您的代码将更容易测试:要测试不同的设置,只需传入不同的构造函数参数。不需要文件等。
  • 您的问题已解决:DAL不再需要查看设置文件
  • 您将配置存储隔离在一个地方,如果您决定(比方说)使用不同的XML格式或“ini”式配置格式,则可能会发生变化

答案 1 :(得分:0)

如果我正确理解了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接口,“products”层与IConfigurationWrapper一起使用,而包装器可以使用您拥有的任何配置(.config或mocks,您也可以使用模拟产品进行测试)。上面的代码被大量剥离了大型系统的一部分只是为了提供一些例子而不是太过于字面意思。