So setzen Sie SetBasePath in ConfigurationBuilder in Core 2.0

141

Wie kann ich den Basispfad in ConfigurationBuilder in Core 2.0 festlegen?

Ich habe diese Frage gegoogelt und gefunden , dies aus Microsoft-Dokumenten und den 2.0- Dokumenten online, aber sie scheinen eine Version Microsoft.Extension.Configurationvon 1.0.0-beta8 zu verwenden .

Ich möchte lesen appsettings.json. Gibt es eine neue Möglichkeit, dies in Core 2.0 zu tun?

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: Zusätzlich zum Hinzufügen von Microsoft.Extensions.Configuration.FileExtensions, wie unten von Set angegeben, musste ich auch Microsoft.Extensions.Configuration.Json hinzufügen , um die AddJsonFileErweiterung zu erhalten.

Padhraic
quelle
2
Das UPDATE hat die Arbeit gemacht!
Chris Rosete
2
Microsoft.Extensions.Configuration.Jsonhat eine Abhängigkeit von Microsoft.Extensions.Configuration.FileExtensions, so dass Sie nur die erstere brauchen.
Johan B
Freunde, BITTE BEACHTEN SIE, dass die AddJsonFile("appsettings.json")Methode Ihre Hosting-Umgebung nicht kennt! Verwenden Sie .AddJsonFile($"appsettings.{_hostingEnvironment.EnvironmentName}.json")stattdessen. : D
Jess

Antworten:

301

Die SetBasePathErweiterungsmethode ist in Config.FileExtensions definiert .

Sie müssen einen Verweis auf das Paket Microsoft.Extensions.Configuration.FileExtensions hinzufügen .

Fügen Sie zum AddJsonFileAuflösen einen Verweis auf das Microsoft.Extensions.Configuration.JsonPaket hinzu.

einstellen
quelle
36
Aber jetzt wird die "AddJsonFile" -Methode nicht gefunden. : DI musste dieses Paket auch hinzufügen: "Microsoft.Extensions.Configuration.Json".
Tadej
5
Microsoft.Extensions.Configuration.Jsonhat eine Abhängigkeit von Microsoft.Extensions.Configuration.FileExtensions, so dass Sie nur die erstere brauchen.
Johan B
61

Ich entwickle eine .NET Core 2-Konsolen-App mit Visual Studio 2017 v15.5. Wie andere angemerkt haben, musste ich nach dem Hinzufügen von Microsoft.Extensions.Configuration Microsoft.Extensions.Configuration.Json hinzufügen, damit der AddJsonFile()Aufruf funktioniert. Dadurch SetBasePath()funktionierte auch der Anruf. Daher musste ich Configuration.FileExtensions nicht hinzufügen . (Mein Code wird mit und ohne kompiliert und ausgeführt.)

Ich hatte auch einen Anruf bei AddEnvironmentVariables(), für den ich Configuration.EnvironmentVariables hinzufügen musste. Mein Code lautet wie folgt:

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

Interessanterweise ist das einzige usingwar Aussage , die ich brauche using Microsoft.Extensions.Configuration.

Ed Graham
quelle
11
Die einzige in der Klassendatei erforderliche using-Anweisung sollte Microsoft.Extensions.Configuration sein. Zum Projekt müssen Sie jedoch die NuGet-Abhängigkeit "Microsoft.Extensions.Configuration.Json" über die Projektoption "NuGet-Pakete verwalten" explizit hinzufügen. Eine Abhängigkeit davon ist "Microsoft.Extensions.Configuration.FileExtensions" und wird daher als Teil der Abhängigkeitsverdrahtung einbezogen. Diese beiden Abhängigkeiten lösen sowohl die Kompilierungsfehler "SetBasePath" als auch "AddJsonFile".
Gregorian
Es ist erwähnenswert, dass dies nicht mehr funktioniert, da VS für Mac Preview 8 das aktuelle Verzeichnis auf bin / netcoreapp2x setzt
Chris Becke
Nicht umständlich zu sein, sondern Configuration.EnvironmentVariables== Microsoft.Extensions.Configuration.EnvironmentVariables. Es gibt verschiedene Dinge mit ähnlichen Namen.
Lee Richardson
12

Verwenden Sie sowohl "Microsoft.Extensions.Configuration" als auch "Microsoft.Extensions.Configuration.Json". Dadurch wird das Problem behoben.

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

Hier ist das Beispiel '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
quelle