【问题标题】:How to loop through configurationSection如何循环配置部分
【发布时间】:2012-11-01 22:34:11
【问题描述】:

我的Web.config 文件中有以下部分:

<configSections>
    <section name="mySection" type="myNameSpace, myProject"/>
</configSections>


<mySection>
    <city id="ny" type="nameSpace1" />
    <city id="dc" type="nameSpace2" />
    <city id="nj" type="nameSpace3" />
</mySection>

在给定id 的情况下,我需要编写循环通过cities 并返回type 的代码。

 if the given id = "ny" --> return nameSpace1
 if the given id = "dc" --> return nameSpace2
 if the given id = "nj" --> return nameSpace3

【问题讨论】:

  • 好吧,我假设您为该部分创建了一个类型 - 在您的配置中,您有 type="myNameSpace, myProject"。如何填充该类型?
  • 好吧,作为一个新手,我用谷歌搜索它并查看了 msdn,发现我应该创建一个实现 ConfigurationSection 的类。但我不知道那个类应该是什么样子。
  • 但是我没有city元素的索引,我只有id
  • 如何实现配置部分取决于您。但是,这听起来不像您应该在 配置 中拥有的信息。它看起来像是属于查找的东西(如字典)。

标签: c# configurationsection


【解决方案1】:

您需要参考该部分:

var theSection = (TypeOfSection)ConfigurationManager.GetSection("mySection");

注意TypeOfSection 的转换 - 这是配置文件中声明的类型。

此时,您应该有一个可以访问和迭代的强类型对象。

【讨论】:

  • 感谢您的回答,但我真的不明白。如何遍历 mySection 城市并给定城市的 id 能够返回类型(在本例中为 nameSpace1、nameSpace2 或 nameSpace3)
  • @Lina - 在我的回答中,我假设您已经编写了一个实现 ConfigurationSection 的类,其中包含一系列城市。
  • 如果您向我展示该类的外观,我将不胜感激,我在谷歌的任何地方都找不到与我拥有的 configurationSection 匹配的替代品
  • @Lina - 当然你不会找到完全相同的。找到相似的并改变它。
  • 建议的解决方案没有回答问题。
【解决方案2】:

在我的回答中,我假设您已经编写了一个实现 ConfigurationSection 的类,该类具有一组城市。 – Oded 2012 年 11 月 13 日 13:50

这个先前的答案在技术上是正确的,尽管我觉得它缺乏细节。我将尝试详细说明@Oded 的回复,希望这将是一个清晰的展示!

步骤

  1. 这里要做的第一件事是实现一个新类,MyConfigSection,它只是一个标准 POCO(Plain Old C Object),每个配置值的属性都将存储在配置源。

    public class MyConfigSection
    {
        public City[] Cities {get; set;}
    }
    

    注意: 我们正在使用类型为City 的对象数组,这是为了根据您的特定用例需要允许多个条目,尽管您不限于任何给定类型。在这种情况下,该类的结构如下:

    public class City
    {
        public string Id {get; set;}
        public string Type {get; set;}
    }
    
  2. 在您选择的源中创建配置部分,并将该部分命名为与预期目的相对应的名称,在这种情况下,我们将调用该部分 mySection 以匹配原始问题。

    <mySection>
        <Cities>
            <city Id="ny" Type="nameSpace1" />
            <city Id="dc" Type="nameSpace2" />
            <city Id="nj" Type="nameSpace3" />
        </Cities>
    </mySection>
    
  3. 现在关键步骤是将MyConfigSection poco 绑定到所需的配置设置部分。我们可以通过将以下代码添加到您的启动类中来实现这一点,而无需通过IOptions&lt;T&gt; 接口:

    var configSection = new MyConfigSection();
    Configuration.Bind("mySection", configSection);
    services.AddSingleton(configSection);
    
  4. 添加绑定并将生成的对象注册到服务容器后,现在可以通过依赖注入在代码库中的任何位置使用它,只需在需要存储值的任何方法中包含MyConfigSection 类型的参数在上述配置中。

    public Type GetCityType(string cityId, MyConfigSection config)
    {
        var typeName = config.Cities
            .Where(x => x.Id == cityId)
            .Select(x => x.Type);
        return Type.GetType(typeName);
    }
    

    在这个特定场景中,设置值的使用稍微复杂一些,因为您正在处理一个额外的 poco 类型的数组,尽管在 LINQ 的帮助下检索必要的值变得非常简单来自城市数组。在您获得与类型对应的字符串并将其存储在typeName 变量中之后,您可以使用反射来返回实际的Type 对象,而不仅仅是一个字符串,如上所示。 GetType() 方法还有几个重载值得一看,它们允许您配置如果找不到具有给定名称的类型会发生什么,以及搜索是否应该区分大小写等)


我希望这个答案对你的情况是明确的和有用的,如果你有任何我没有完全回答的问题,请发表评论,我一定会通过一些额外的阐述来更新答案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2017-05-11
    相关资源
    最近更新 更多