F # чтение пользовательской конфигурации и представление ее как ConfigurationSection с ConfigurationElements - PullRequest
2 голосов
/ 27 мая 2019

Я довольно новичок в 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 (witch относится к имени узла 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 ]

2 голосов
/ 27 мая 2019

В 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
2 голосов
/ 27 мая 2019

Я не уверен, что это именно то, что вам нужно после того, как вы упомянули об использовании «пользовательского файла конфигурации», но в прошлом я использовал провайдер типа AppSettings , чтобы получить строго типизированный доступ к переменным приложения.

Если это не подходит, есть также более стандартный поставщик типов XML , который может помочь?

Я считаю, что поставщики типов действительно полезны, так как не требуют написания стандартного кода для простого доступа, и они действительно полезная особенность разработки на F #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...