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

5
我们有一个.NET Framework .dll,现在正在将其移植到.NET Core。目前,我们从System.Configuration继承ConfigurationElement和ConfigurationSection,以在app.config(或其.NET Core等效项)中创建自定义配置部分。
问题:
  1. 看起来使用 .NET Core 的方法是 Microsoft.Extensions.Configuration。这是正确的吗?因为它存在于 ASP.NET Coregithub 项目 上,而不是 .NET Coregithub 项目 上。我们没有 ASP 部分。

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

  3. 在 .NET Core 2.0 中,是否会支持传统的 ConfigurationElementConfigurationSection,从而避免任何此类移植工作的必要性?我问这个问题的原因是 .NET Core 2.0 Roadmap 表示:

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


Microsoft.Extensions.Configuration 在 ASP.NET Core 中存在是什么意思?你可以在任何项目中使用它,甚至在完整的框架中也可以使用。 - Andrii Litvinov
尽管它位于此处,但与ASP.NET的任何内容都没有依赖关系,请检查NuGet https://www.nuget.org/packages/Microsoft.Extensions.Configuration/. - Andrii Litvinov
我不认为有必要重新发明轮子。Microsoft.Extensions.Configuration 做得非常好。而且还支持强类型的配置对象。 - Andrii Litvinov
相关:ASP.Net Core的配置示例:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration - VMAtm
3个回答

6

随着.NET Standard 2.0的发布,现在可以在Linux上使用你平常使用的System.Configuration,即使在.NET Core 2.0中也是如此!

这里有一个测试示例:

  1. 创建了一个.NET Standard 2.0库(称为MyLib.dll
  2. 添加NuGet包System.Configuration.ConfigurationManagerv4.4.0。这是必要的,因为此包不包含在元包NetStandard.Libraryv2.0.0中
  3. 所有C#类都派生自ConfigurationSectionConfigurationElement,放入MyLib.dll中。例如,MyClass.cs派生自ConfigurationSection,而MyAccount.cs派生自ConfigurationElement。实现细节超出了本文的范围,但Google是你的朋友
  4. 创建一个.NET Core 2.0应用程序(例如控制台应用程序MyApp.dll)。与Framework不同,.NET Core应用程序以.dll结尾而不是.exe
  5. MyApp中创建一个app.config文件,其中包含您的自定义配置部分。这显然应该与上述第3点中的类设计相匹配。例如:
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <section name="myCustomConfig" type="MyNamespace.MyClass, MyLib" />
      </configSections>
      <myCustomConfig>
        <myAccount id="007" />
      </myCustomConfig>
    </configuration>

这就是全部内容 - 你会发现在MyApp中正确解析了app.config,而你现有的代码在MyLib中也能正常工作。如果从Windows(开发)切换到Linux(测试),别忘了运行dotnet restore


6

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

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 CoreMicrosoft.Extensions.Configuration非常可扩展,它可以使用不同的设置提供程序,如环境变量、命令行参数等。因此,如果需要,可以实现ConfigurationSection-like配置的自定义提供程序。
基于这个评论,他们不打算将System.Configuration带到NetStandard 2.0。

你能否也评论一下第三个问题?.NET Core 2.0? - DeepSpace101
我还没有听说过这样的计划,我认为可以在他们的代码库中搜索,我会尝试看一下。 - Andrii Litvinov
根据此评论 https://github.com/dotnet/standard/issues/254#issuecomment-289072521,他们不会将System.Configuration引入NetStandard 2.0。 - Andrii Litvinov
那么 https://github.com/dotnet/corefx/tree/master/src/System.Configuration.ConfigurationManager 呢?看起来 corefx 2.0 将包含 System.Configuration。即使它不是 netstandard2 的一部分。 - Shrike
2
@AndriiLitvinov 是的,我会发布。可能你(和我一样)看过 netstandard2 API,但缺少了这些类型... - Shrike
显示剩余3条评论

2
除了使用描述的迁移方式到Microsoft.Extensions.Configuration(这完全有意义)之外,至少我希望可以在.NET Core 2上使用与System.Configuration相同的类型。以下是System.Configuration类型在corefx中的链接:https://github.com/dotnet/corefx/tree/master/src/System.Configuration.ConfigurationManager。我无法告诉您它们是否与完整的.NET版本中的类型完全兼容,但至少这给我们带来了希望。因此,看起来.NET Core 2将具有旧的System.Configuration内容,但不包括netstandard2。可能是因为微软不想在其他平台(Xamarin)共享这些类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接