.Net Framework 和.Net Core 的通用配置策略

Common Configuration strategy for .Net Framework and .Net Core

这更像是一个与架构相关的问题。我正在致力于 extend.net 框架应用程序以添加 .net 核心支持。现在我的应用程序正在使用 System.Configuration.ConfigurationManager class 来读取所有配置并且 class 很重要,因为在引导 DI 时使用了一些与读取动态模块相关的配置。现在我看到 .net 核心不依赖这个 ConfigurationManager class 并且有自己的 JSON 格式的 appsettings 配置文件。这将需要我更改策略以具有支持框架和核心的通用逻辑。

我正在就社区如何解决此问题以及最佳前进方式寻求任何建议。

App.config

<appSettings>
    <add key="EndPointAssembliesPath" value="<some directory path>" />
    <add key="ModulesPath" value="<some directory path>" />
    <add key="BusinessAssembliesScanningPattern" value="*.BusinessModule.*.dll" />
</appSettings>
<connectionStrings>
    <add name="CompanyDatabase" providerName="System.Data.SqlClient" connectionString="Data Source=.;Initial Catalog=DataSource;Integrated Security=SSPI;" />
</connectionStrings>

appsettings.json

"EndPointAssembliesPath": "<some path>",
"BusinessModulesPath": "<some directory path>",
"BusinessAssembliesScanningPattern": "*.BusinessModule.*.dll",
"ConnectionStrings": {
    "CompanyDatabase": "Data Source=.;Initial Catalog=DataSource;Integrated Security=SSPI;"
}

检查应用程序使用的是 web.config 文件还是 json 文件。连接字符串的示例:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    { 
        if (ConfigurationManager.ConnectionStrings["DefaultConnection"] != null)
        {
            optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
        }
        else
        {
            var connString = AppConfigSettings.Current.AppConnection;
            optionsBuilder.UseSqlServer(connString);
        }
    }

请看Configuration providers in .NET。所有示例都旨在与 .NET Core 一起使用,但大多数 NuGet 包都与 .NET Standard 2.0 兼容。因此,您应该能够从与 .NET Standard 2.0 兼容的任何 .NET Framework 应用程序中使用它们。

您的代码可能看起来有点像这样:

var configurationBuilder = new ConfigurationBuilder();
configurationBuilder.SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
    .AddXmlFile("App.config", optional: true, reloadOnChange: true);
var config = configurationBuilder.Build();

从那时起,您可以使用统一的 config 对象。

免责声明:我没有测试,但我很有信心