Cara SetBasePath di ConfigurationBuilder di Core 2.0

149

Bagaimana cara mengatur jalur dasar di ConfigurationBuilder di Core 2.0.

Saya telah mencari di Google dan menemukan pertanyaan ini , ini dari dokumen Microsoft, dan dokumen 2.0 online tetapi tampaknya mereka menggunakan versi Microsoft.Extension.Configurationdari 1.0.0-beta8 .

Saya ingin membaca appsettings.json. Apakah ada cara baru untuk melakukan ini di 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: Selain menambahkan Microsoft.Extensions.Configuration.FileExtensions seperti yang ditunjukkan di bawah ini oleh Set I juga perlu menambahkan Microsoft.Extensions.Configuration.Json untuk mendapatkan AddJsonFileekstensi.

Padhraic
sumber
2
UPDATE berhasil!
Chris Rosete
3
Microsoft.Extensions.Configuration.Jsonmemiliki ketergantungan Microsoft.Extensions.Configuration.FileExtensions, jadi Anda hanya perlu yang pertama.
Johan B
Teman-teman, HARAP DICATAT, AddJsonFile("appsettings.json")metode ini tidak mengetahui lingkungan hosting Anda! Gunakan .AddJsonFile($"appsettings.{_hostingEnvironment.EnvironmentName}.json")sebagai gantinya. : D
Jess

Jawaban:

323

The SetBasePathmetode ekstensi didefinisikan dalam Config.FileExtensions .

Anda perlu menambahkan referensi ke paket Microsoft.Extensions.Configuration.FileExtensions .

Untuk mengatasi AddJsonFile, tambahkan referensi ke Microsoft.Extensions.Configuration.Jsonpaket.

Set
sumber
38
Tapi sekarang metode "AddJsonFile" tidak ditemukan. : DI harus menambahkan paket ini juga: "Microsoft.Extensions.Configuration.Json".
Tadej
6
Microsoft.Extensions.Configuration.Jsonmemiliki ketergantungan Microsoft.Extensions.Configuration.FileExtensions, jadi Anda hanya perlu yang pertama.
Johan B
63

Saya mengembangkan aplikasi konsol .NET Core 2 menggunakan Visual Studio 2017 v15.5. Seperti yang telah dicatat orang lain, setelah menambahkan Microsoft.Extensions.Configuration saya perlu menambahkan Microsoft.Extensions.Configuration.Json agar AddJsonFile()panggilan tersebut berfungsi. Ini juga membuat SetBasePath()panggilan itu berhasil; jadi saya tidak perlu menambahkan Configuration.FileExtensions . (Kode saya mengkompilasi dan berjalan dengan dan tanpa itu.)

Saya juga mendapat panggilan ke AddEnvironmentVariables(), dan saya perlu menambahkan Configuration.EnvironmentVariables. Kode saya adalah sebagai berikut:

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

Menariknya, satu-satunya usingpernyataan yang saya butuhkan adalah using Microsoft.Extensions.Configuration.

Ed Graham
sumber
11
Satu-satunya pernyataan penggunaan yang diperlukan dalam file kelas harus Microsoft.Extensions.Configuration. Namun, untuk proyek Anda harus secara eksplisit menambahkan ketergantungan NuGet "Microsoft.Extensions.Configuration.Json" melalui opsi Kelola Paket NuGet proyek. Dependensi ini adalah "Microsoft.Extensions.Configuration.FileExtensions" dan oleh karena itu akan disertakan sebagai bagian dari wire-up dependensi. Kedua dependensi ini akan menyelesaikan kesalahan kompilasi "SetBasePath" dan "AddJsonFile".
gregsonian
Perlu diperhatikan bahwa ini tidak lagi berfungsi karena VS untuk Mac Preview 8 menetapkan direktori saat ini ke bin / netcoreapp2x
Chris Becke
Tidak terlalu bertele-tele tapi Configuration.EnvironmentVariables== Microsoft.Extensions.Configuration.EnvironmentVariables. Ada beberapa hal yang namanya mirip.
Lee Richardson
12

Gunakan 'Microsoft.Extensions.Configuration' dan 'Microsoft.Extensions.Configuration.Json' ini akan menyelesaikan masalah.

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

Berikut adalah contoh '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
sumber