ChatGPT解决这个技术问题 Extra ChatGPT

How to SetBasePath in ConfigurationBuilder in Core 2.0

How can I set the base path in ConfigurationBuilder in Core 2.0.

I have googled and found this question, this from Microsoft docs, and the 2.0 docs online but they seem to be using a version of Microsoft.Extension.Configuration from 1.0.0-beta8.

I want to read appsettings.json. Is there a new way of doing this in 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"
  }
}

UPDATE: In addition to adding Microsoft.Extensions.Configuration.FileExtensions as indicated below by Set I also needed to add Microsoft.Extensions.Configuration.Json to get the AddJsonFile extension.

The UPDATE made the work!
Microsoft.Extensions.Configuration.Json has a dependency on Microsoft.Extensions.Configuration.FileExtensions, so you just need the former.
Friends, PLEASE NOTE, the AddJsonFile("appsettings.json") method is not aware of your hosting environment! Use .AddJsonFile($"appsettings.{_hostingEnvironment.EnvironmentName}.json") instead. :D

B
Bakudan

The SetBasePath extension method is defined in Config.FileExtensions.

You need to add a reference to the Microsoft.Extensions.Configuration.FileExtensions package.

To resolve AddJsonFile, add a reference to the Microsoft.Extensions.Configuration.Json package.


But now the "AddJsonFile" method is not found. :D I had to add this package also: "Microsoft.Extensions.Configuration.Json".
Microsoft.Extensions.Configuration.Json has a dependency on Microsoft.Extensions.Configuration.FileExtensions, so you just need the former.
do manage the nuget packages on solution level not the project level
E
Ed Graham

I'm developing a .NET Core 2 console app using Visual Studio 2017 v15.5. As others have noted, after adding Microsoft.Extensions.Configuration I needed to add Microsoft.Extensions.Configuration.Json to get the AddJsonFile() call to work. This also made the SetBasePath() call work; so I did not need to add Configuration.FileExtensions . (My code compiles and runs both with and without it.)

I also had a call to AddEnvironmentVariables(), for which I needed to add Configuration.EnvironmentVariables. My code is as follows:

  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();

Interestingly, the only using statement I needed was using Microsoft.Extensions.Configuration.


The only using statement necessary in the class file should be Microsoft.Extensions.Configuration. However, to the project you must explicitly add the NuGet dependency "Microsoft.Extensions.Configuration.Json" via Manage NuGet Packages project option. A dependency of this is "Microsoft.Extensions.Configuration.FileExtensions" and will therefore be included as part of the dependency wire-up. These two dependencies will solve both the "SetBasePath" and "AddJsonFile" compilation errors.
It's worth pointing out that this no longer works as VS for Mac Preview 8 sets the current directory to bin/netcoreapp2x
Not to be pedantic but Configuration.EnvironmentVariables == Microsoft.Extensions.Configuration.EnvironmentVariables. There are several things with similar names.
A
Anish Manchappillil

Use both 'Microsoft.Extensions.Configuration' and 'Microsoft.Extensions.Configuration.Json' this will solve the problem.

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

Here is the sample '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
} }

D
Darshan Jain

After adding reference if you are still unable to get the content of JSON.

Go to in properties of JSON (right-click on JSON file > properties) change "Copy to Output Directory" to "Copy Always"

check screenshot