web-dev-qa-db-fra.com

Comment SetBasePath dans ConfigurationBuilder dans Core 2.0

Comment définir le chemin de base dans ConfigurationBuilder dans Core 2.0.

J'ai googlé et trouvé this question, this de Microsoft docs, et le 2. docs en ligne, mais ils semblent utiliser une version de Microsoft.Extension.Configuration de 1.0.0-beta8 .

Je veux lire appsettings.json. Existe-t-il une nouvelle manière de faire cela dans 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: En plus d'ajouter Microsoft.Extensions.Configuration.FileExtensions comme indiqué ci-dessous par Set J'avais également besoin d'ajouter Microsoft.Extensions.Configuration.Json pour obtenir l'extension AddJsonFile.

101
Padhraic

La méthode d'extension SetBasePath est définie dans Config.FileExtensions .

Vous devez ajouter une référence au package Microsoft.Extensions.Configuration.FileExtensions .

Pour résoudre AddJsonFile, ajoutez une référence au package Microsoft.Extensions.Configuration.Json.

192
Set

Je développe une application console .NET Core 2 à l'aide de Visual Studio 2017 v15.5. Comme d'autres l'ont fait remarquer, après avoir ajouté Microsoft.Extensions.Configuration, je devais ajouter Microsoft.Extensions.Configuration.Json pour que l'appel AddJsonFile() puisse fonctionner. Cela a également rendu la SetBasePath() call work; donc je n'a pas besoin pour ajouter Configuration.FileExtensions. (Mon code est compilé et exécuté avec et sans.)

J'ai également eu un appel à AddEnvironmentVariables(), pour lequel je devais ajouter Configuration.EnvironmentVariables. Mon code est le suivant:

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

Fait intéressant, la seule déclaration using dont j'avais besoin était using Microsoft.Extensions.Configuration.

47
Ed Graham

Utilisez à la fois 'Microsoft.Extensions.Configuration' et 'Microsoft.Extensions.Configuration.Json' pour résoudre le problème.

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

Voici l'exemple '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
} }
8