How to SetBasePath in ConfigurationBuilder in Core 2.0

C#asp.net CoreConfiguration.Net Core

C# Problem Overview


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.

C# Solutions


Solution 1 - C#

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.

Solution 2 - C#

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.

Solution 3 - C#

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
} }

Solution 4 - C#

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPadhraicView Question on Stackoverflow
Solution 1 - C#SetView Answer on Stackoverflow
Solution 2 - C#Ed GrahamView Answer on Stackoverflow
Solution 3 - C#Anish ManchappillilView Answer on Stackoverflow
Solution 4 - C#Darshan JainView Answer on Stackoverflow