Comment SetBasePath dans ConfigurationBuilder dans Core 2.0

143

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

J'ai googlé et trouvé cette question, ce à partir de documents Microsoft et les 2.0 docs en ligne , mais ils semblent utiliser une version Microsoft.Extension.Configurationde 1.0.0-beta8 .

Je veux lire appsettings.json. Existe-t-il une nouvelle façon 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"
  }
}

MISE À JOUR: 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' AddJsonFileextension.

Padhraic
la source
2
La mise à jour a fait le travail!
Chris Rosete
2
Microsoft.Extensions.Configuration.Jsona une dépendance sur Microsoft.Extensions.Configuration.FileExtensions, donc vous avez juste besoin du premier.
Johan B
Amis, VEUILLEZ NOTER que la AddJsonFile("appsettings.json")méthode ne connaît pas votre environnement d'hébergement! Utilisez .AddJsonFile($"appsettings.{_hostingEnvironment.EnvironmentName}.json")plutôt. : D
Jess

Réponses:

302

La SetBasePathméthode d'extension 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 Microsoft.Extensions.Configuration.Jsonpackage.

Ensemble
la source
36
Mais maintenant, la méthode "AddJsonFile" est introuvable. : DI a dû également ajouter ce package: "Microsoft.Extensions.Configuration.Json".
Tadej
5
Microsoft.Extensions.Configuration.Jsona une dépendance sur Microsoft.Extensions.Configuration.FileExtensions, donc vous avez juste besoin du premier.
Johan B
61

Je développe une application console .NET Core 2 à l'aide de Visual Studio 2017 v15.5. Comme d'autres l'ont noté, après avoir ajouté Microsoft.Extensions.Configuration, j'avais besoin d'ajouter Microsoft.Extensions.Configuration.Json pour que l' AddJsonFile()appel fonctionne. Cela a également fait fonctionner l' SetBasePath()appel; je n'ai donc pas eu besoin d'ajouter Configuration.FileExtensions . (Mon code se compile et s'exécute avec et sans lui.)

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 usingdéclaration dont j'avais besoin était using Microsoft.Extensions.Configuration.

Ed Graham
la source
11
La seule instruction using nécessaire dans le fichier de classe doit être Microsoft.Extensions.Configuration. Toutefois, au projet, vous devez ajouter explicitement la dépendance NuGet «Microsoft.Extensions.Configuration.Json» via l'option de projet Gérer les packages NuGet. Une dépendance de ceci est "Microsoft.Extensions.Configuration.FileExtensions" et sera donc incluse dans le cadre de la connexion de la dépendance. Ces deux dépendances résoudront les erreurs de compilation "SetBasePath" et "AddJsonFile".
gregsonian
Il convient de noter que cela ne fonctionne plus car VS pour Mac Preview 8 définit le répertoire actuel sur bin / netcoreapp2x
Chris Becke
Ne pas être pédant mais Configuration.EnvironmentVariables== Microsoft.Extensions.Configuration.EnvironmentVariables. Il y a plusieurs choses avec des noms similaires.
Lee Richardson le
12

Utilisez à la fois «Microsoft.Extensions.Configuration» et «Microsoft.Extensions.Configuration.Json», cela résoudra 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
} }
Anish Manchappillil
la source