通过POCO将System.Configuration移植到.NET Core?

时间:2017-04-20 05:34:00

标签: c# .net .net-core

我们有.NET Framework .dll我们正在移植到.NET Core。目前,我们继承自ConfigurationElement的{​​{1}}和ConfigurationSection以在System.Configuration(或其.NET Core等效版本)中创建自定义配置部分

问题:

  1. .NET Core方式似乎是app.config。那是对的吗?因为它位于Microsoft.Extensions.Configuration的{​​{3}}而不是ASP.NET Core的{​​{3}}。我们没有ASP部件。

  2. 如果是这样,创建和加载自定义配置部分的任何.NET Core示例都不依赖于.NET Core?理想情况下,我们希望直接从文本源(XML或JSON)读取POCO对象图,以获得强类型的好处。

  3. 使用.NET Core 2.0,是否会支持传统的startup.csConfigurationElement否定开始任何此类移植工作的需要?我问的原因是github project

      

    .NET Core从.NET Framework获得5,000多个API,作为这项工作的一部分,使其成为一个更广泛的平台。

3 个答案:

答案 0 :(得分:6)

我不知道app.config中的System.Configuration.NET Core支持。可能,不,但这只是猜测。您可以在.NET Core方法中设置Main应用程序的配置:

class Program
{
    static void Main(string[] args)
    {
        var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();

        var poco = new Poco();
        configuration.Bind(poco);

        Console.WriteLine(poco);
        Console.ReadKey();
    }
}

class Poco
{
    public bool Enabled { get; set; }
    public Sort Sort { get; set; }

    public override string ToString()
    {
        return $"Enabled={Enabled}, SortOrder={Sort.Order}";
    }
}

class Sort
{
    public int Order { get; set; }
}

appsettings.json正在关注:

{
  "enabled": true,
  "sort": {
    "order": 2
  }
}

输出:

Enabled=True, SortOrder=2

您需要引用Microsoft.Extensions.Configuration.JsonMicrosoft.Extensions.Configuration.Binder个包。

不依赖于ASP.NET Core

Microsoft.Extensions.Configuration是可扩展的,它可以使用不同的设置提供程序,如环境变量,命令行参数等。因此,可以为ConfigurationSection实现自定义提供程序 - 如果需要,可以配置。

基于this comment,他们不会将System.Configuration引入NetStandard 2.0。

答案 1 :(得分:2)

除了描述迁移到Microsoft.Extensions.Configuration(完全有意义)的方式之外,它应该(至少我希望)可以在.NET Core 2上使用System.Configuration中的相同类型。

核心fx中的System.Configuration类型: https://github.com/dotnet/corefx/tree/master/src/System.Configuration.ConfigurationManager

我无法告诉您它们与完整的.NET完全兼容。但至少它是带给我们希望的东西)

因此看起来.NET Core 2将具有旧的System.Configuration内容而不是netstandard2。可能是因为MS并不想在其他平台(Xamarin)中分享这些类型。

答案 2 :(得分:2)

随着.NET Standard 2.0版本的尘埃落定,即使在Linux上的.NET Core 2.0中,也可以使用平常的System.Configuration

这是一个测试示例:

  1. 创建了一个.NET Standard 2.0库(比如MyLib.dll
  2. 添加了NuGet包System.Configuration.ConfigurationManager v4.4.0。这是必需的,因为元包NetStandard.Library v2.0.0
  3. 不包含此包。
  4. ConfigurationSectionConfigurationElement派生的所有C#类都会进入MyLib.dll。例如,MyClass.cs派生自ConfigurationSectionMyAccount.cs派生自ConfigurationElement。实施细节不在此范围,但Google is your friend
  5. 创建.NET Core 2.0应用程序(例如控制台应用程序MyApp.dll)。 .NET Core应用程序以.dll结束,而不是在Framework中以.exe结束。
  6. 使用您的自定义配置部分在app.config中创建MyApp。这显然应该与上面#3中的班级设计相匹配。例如:
  7.     <?xml version="1.0" encoding="utf-8"?>
        <configuration>
          <configSections>
            <section name="myCustomConfig" type="MyNamespace.MyClass, MyLib" />
          </configSections>
          <myCustomConfig>
            <myAccount id="007" />
          </myCustomConfig>
        </configuration>
    

    它是 - 你会发现app.config在MyApp内正确解析,MyLib中的现有代码运行正常。如果您将平台从Windows(dev)切换到Linux(测试),请不要忘记运行dotnet restore