Cómo SetBasePath en ConfigurationBuilder en Core 2.0

143

¿Cómo puedo establecer la ruta base en ConfigurationBuilder en Core 2.0?

He buscado en Google y encontró esta cuestión, este de documentos de Microsoft, y los 2.0 documentos en línea, pero parece que están usando una versión de Microsoft.Extension.Configurationde 1.0.0-Beta8 .

Quiero leer appsettings.json. ¿Hay una nueva forma de hacer esto en 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"
  }
}

ACTUALIZACIÓN: Además de agregar Microsoft.Extensions.Configuration.FileExtensions como se indica a continuación mediante Set , también necesitaba agregar Microsoft.Extensions.Configuration.Json para obtener la AddJsonFileextensión.

Padhraic
fuente
2
La actualización hizo el trabajo!
Chris Rosete
2
Microsoft.Extensions.Configuration.Jsontiene una dependencia Microsoft.Extensions.Configuration.FileExtensions, por lo que solo necesita el primero.
Johan B
Amigos, TENGA EN CUENTA que el AddJsonFile("appsettings.json")método no conoce su entorno de alojamiento. Usar en su .AddJsonFile($"appsettings.{_hostingEnvironment.EnvironmentName}.json")lugar. : D
Jess

Respuestas:

302

El SetBasePathmétodo de extensión se define en Config.FileExtensions .

Debe agregar una referencia al paquete Microsoft.Extensions.Configuration.FileExtensions .

Para resolver AddJsonFile, agregue una referencia al Microsoft.Extensions.Configuration.Jsonpaquete.

Conjunto
fuente
36
Pero ahora no se encuentra el método "AddJsonFile". : DI tuvo que agregar este paquete también: "Microsoft.Extensions.Configuration.Json".
Tadej
55
Microsoft.Extensions.Configuration.Jsontiene una dependencia Microsoft.Extensions.Configuration.FileExtensions, por lo que solo necesita el primero.
Johan B
61

Estoy desarrollando una aplicación de consola .NET Core 2 con Visual Studio 2017 v15.5. Como otros han señalado, después de agregar Microsoft.Extensions.Configuration, necesitaba agregar Microsoft.Extensions.Configuration.Json para que la AddJsonFile()llamada funcione. Esto también hizo que la SetBasePath()llamada funcionara; así que no necesité agregar Configuration.FileExtensions . (Mi código se compila y se ejecuta con y sin él).

También tuve una llamada a la AddEnvironmentVariables()cual necesitaba agregar Configuration.EnvironmentVariables. Mi código es el siguiente:

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

Curiosamente, la única usingdeclaración que necesitaba era using Microsoft.Extensions.Configuration.

Ed Graham
fuente
11
La única declaración de uso necesaria en el archivo de clase debe ser Microsoft.Extensions.Configuration. Sin embargo, al proyecto debe agregar explícitamente la dependencia NuGet "Microsoft.Extensions.Configuration.Json" a través de la opción de proyecto Administrar paquetes NuGet. Una dependencia de esto es "Microsoft.Extensions.Configuration.FileExtensions" y, por lo tanto, se incluirá como parte del cableado de dependencia. Estas dos dependencias resolverán los errores de compilación "SetBasePath" y "AddJsonFile".
gregsonian
Vale la pena señalar que esto ya no funciona ya que VS para Mac Preview 8 establece el directorio actual en bin / netcoreapp2x
Chris Becke
No ser pedante sino Configuration.EnvironmentVariables== Microsoft.Extensions.Configuration.EnvironmentVariables. Hay varias cosas con nombres similares.
Lee Richardson el
12

Use 'Microsoft.Extensions.Configuration' y 'Microsoft.Extensions.Configuration.Json' para resolver el problema.

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

Aquí está la muestra '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
fuente