F#读取自定义配置,并将其表示为具有ConfigurationElements的ConfigurationSection

时间:2019-05-27 07:02:04

标签: f#

我对F#相当陌生,但是我对创建和读取自定义配置文件有疑问。我知道它在C#中的外观,例如,我有一个简单的配置文件

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <configSections>
    <section name="customSection" type="Tool.Lib.Config, Tool.Lib" />
  </configSections>

  <communicationSection>
    <responseTimeoutInMs value="900000" />
  </communicationSection>

</configuration>

基于c#的操作很简单。我正在创建名为Config的模型,其属性标记为ConfigurationProperty(女巫与xml节点名称有关,在本例中为responseTimeoutInMs),类似于:

[ConfigurationProperty("responseTimeoutInMs")]
public ResponseTimeoutConfigElement ResponseTimeoutInMs
{
   get => (ResponseTimeoutConfigElement)base["responseTimeoutInMs"];
   set => base["responseTimeoutInMs"] = value;
}

当然将值设置为ConfigurationElement,

public class ResponseTimeoutConfigElement : ConfigurationElement
{
    [ConfigurationProperty("value", IsRequired = true, IsKey = true, DefaultValue = 0)]
    public int Value => (int)base["value"];
}

这是一种很好的机制,我可以在读取配置时将转换器固定在其中并创建所需的类型。

我知道我可以使用ConfigurationManager和exe配置图读取默认配置,但这是使用键和值进行的基本配置读取。

所以我的问题是,F#中是否有与C#中类似的东西?

2 个答案:

答案 0 :(得分:2)

我不确定使用“自定义配置文件”来获取的内容是否与您所追求的完全一样,但是在过去,我使用AppSettings Type Provider来获得对应用程序变量的强类型访问。

如果不合适,还可以使用更标准的XML type provider吗?

我发现类型提供程序对于避免为简单访问而编写样板代码非常有用,并且它们是F#开发的一个非常好的功能。

答案 1 :(得分:2)

在F#中,您可以执行与C#中几乎相同的操作:

type ResponseTimeoutConfigElement() =
    inherit ConfigurationElement()

    [<ConfigurationProperty("value", IsRequired = true, IsKey = true, DefaultValue = 0)>]
    member this.Value = base.["value"] :?> int

type Config() =
    inherit ConfigurationSection()

    [<ConfigurationProperty("responseTimeoutInMs")>]
    member this.ResponseTimeInMs
        with get() = base.["responseTimeoutInMs"] :?> ResponseTimeoutConfigElement
        and set (value: ResponseTimeoutConfigElement) = base.["responseTimeoutInMs"] <- value