如何在 Core 2.0 的 ConfigurationBuilder 中设置 BasePath

Posted

技术标签:

【中文标题】如何在 Core 2.0 的 ConfigurationBuilder 中设置 BasePath【英文标题】:How to SetBasePath in ConfigurationBuilder in Core 2.0 【发布时间】:2018-04-01 06:53:00 【问题描述】:

如何在 Core 2.0 的 ConfigurationBuilder 中设置基本路径。

我在 Google 上搜索并找到了 this 问题、来自 Microsoft 文档的 this 以及在线的 2.0 文档,但他们似乎使用的是来自 1.0.0-beta8 的 Microsoft.Extension.Configuration 版本。

我想阅读appsettings.json。在 Core 2.0 中是否有新的方法来做到这一点?

using System;
using System.IO;
using Microsoft.Extensions.Configuration;
namespace ConsoleApp2

    class Program
    
        public static IConfigurationRoot Configuration  get; set; 

        static void Main(string[] args)
        
            var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory()) // <== compile failing here
                .AddJsonFile("appsettings.json");

            Configuration = builder.Build();

            Console.WriteLine(Configuration.GetConnectionString("con"));
            Console.WriteLine("Press a key...");
            Console.ReadKey();
        
    

appsetting.json


  "ConnectionStrings": 
    "con": "connection string"
  

更新: 除了添加Microsoft.Extensions.Configuration.FileExtensions 如下Set 所示,我还需要添加Microsoft.Extensions.Configuration.Json 以获得AddJsonFile 扩展。

【问题讨论】:

更新成功了! Microsoft.Extensions.Configuration.Json 依赖于Microsoft.Extensions.Configuration.FileExtensions,所以你只需要前者。 朋友们,请注意,AddJsonFile("appsettings.json") 方法不知道您的托管环境!请改用.AddJsonFile($"appsettings._hostingEnvironment.EnvironmentName.json")。 :D 【参考方案1】:

SetBasePath 扩展方法在Config.FileExtensions 中定义。

您需要添加对Microsoft.Extensions.Configuration.FileExtensions 包的引用。

要解析AddJsonFile,请添加对Microsoft.Extensions.Configuration.Json 包的引用。

【讨论】:

但是现在找不到“AddJsonFile”方法。 :D 我还必须添加这个包:“Microsoft.Extensions.Configuration.Json”。 Microsoft.Extensions.Configuration.Json 依赖于Microsoft.Extensions.Configuration.FileExtensions,所以你只需要前者。 在解决方案级别而不是项目级别管理 nuget 包【参考方案2】:

我正在使用 Visual Studio 2017 v15.5 开发一个 .NET Core 2 控制台应用程序。正如其他人所指出的,在添加 Microsoft.Extensions.Configuration 之后,我需要添加 Microsoft.Extensions.Configuration.Json 以使 AddJsonFile() 调用正常工作。这也使SetBasePath() 呼叫工作;所以我 不需要 添加 Configuration.FileExtensions 。 (我的代码在有和没有它的情况下都可以编译和运行。)

我还打电话给AddEnvironmentVariables(),为此我需要添加 Configuration.EnvironmentVariables。我的代码如下:

  var builder = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory()) // requires Microsoft.Extensions.Configuration.Json
                    .AddJsonFile("appsettings.json") // requires Microsoft.Extensions.Configuration.Json
                    .AddEnvironmentVariables(); // requires Microsoft.Extensions.Configuration.EnvironmentVariables
  Configuration = builder.Build();

有趣的是,我需要的唯一 using 语句是 using Microsoft.Extensions.Configuration

【讨论】:

类文件中唯一需要的 using 语句应该是 Microsoft.Extensions.Configuration。但是,您必须通过管理 NuGet 包项目选项显式添加 NuGet 依赖项“Microsoft.Extensions.Configuration.Json”到项目中。它的一个依赖项是“Microsoft.Extensions.Configuration.FileExtensions”,因此将作为依赖项连接的一部分包含在内。这两个依赖将解决“SetBasePath”和“AddJsonFile”编译错误。 值得指出的是,这不再适用,因为 VS for Mac Preview 8 将当前目录设置为 bin/netcoreapp2x 不要迂腐,而是Configuration.EnvironmentVariables == Microsoft.Extensions.Configuration.EnvironmentVariables。有几个名字相似的东西。【参考方案3】:

同时使用 'Microsoft.Extensions.Configuration' 和 'Microsoft.Extensions.Configuration.Json' 这将解决问题。

https://www.nuget.org/packages/Microsoft.Extensions.Configuration/ https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Json/

这里是示例“ConnectionFactory”

using System.Data;
using System.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using System.IO;

namespace DataAccess.Infrastructure

 public class ConnectionFactory : IConnectionFactory
 
    public ConnectionFactory()
    
        var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");
        Configuration = builder.Build();
    


    public IConfigurationRoot Configuration  get; 
    public IDbConnection GetConnection
    
        get
        
            var connectionString = Configuration.GetConnectionString("DefaultConnection");
            var conn = new SqlConnection(connectionString);
            conn.Open();
            return conn;
        
    

    #region IDisposable Support
    private bool disposedValue = false; // To detect redundant calls

    protected virtual void Dispose(bool disposing)
    
        if (!disposedValue)
        
            if (disposing)
            
                // TODO: dispose managed state (managed objects).
            


            // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
            // TODO: set large fields to null.

            disposedValue = true;
        
    

    // TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
    // ~ConnectionFactory() 
    //   // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
    //   Dispose(false);
    // 

    // This code added to correctly implement the disposable pattern.
    public void Dispose()
    
        // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
        Dispose(true);
        // TODO: uncomment the following line if the finalizer is overridden above.
        // GC.SuppressFinalize(this);
    
    #endregion
 

【讨论】:

以上是关于如何在 Core 2.0 的 ConfigurationBuilder 中设置 BasePath的主要内容,如果未能解决你的问题,请参考以下文章

聊一聊如何在.NET Core中使用Nacos 2.0

如何在.Net Core 2.0 App中读取appsettings.json

如何在 ASP.NET Core 2.0 中设置多个身份验证方案?

如何在新创建的 .NET Core 2.0 Web 应用程序中定位 .NET Standard 2.0?

如何在 .Net Core 2.0 中创建应用程序变量?

如何在 ASP.NET Core 2.0 Razor 页面中填充下拉列表