Cách SetBasePath trong Cấu hình cấu hình trong Core 2.0


142

Làm cách nào tôi có thể đặt đường dẫn cơ sở trong Cấu hình trong Core 2.0.

Tôi đã googled và tìm thấy câu hỏi này , câu hỏi này từ tài liệu của Microsoft và tài liệu 2.0 trực tuyến nhưng dường như họ đang sử dụng phiên bản Microsoft.Extension.Configurationtừ 1.0.0-beta8 .

Tôi muốn đọc appsettings.json. Có cách nào mới để làm điều này trong Core 2.0 không?

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"
  }
}

CẬP NHẬT: Ngoài việc thêm Microsoft.Extensions.Configuration.FileExtensions như được chỉ ra bên dưới bởi Set Tôi cũng cần thêm Microsoft.Extensions.Configuration.Json để có AddJsonFiletiện ích mở rộng.


2
CẬP NHẬT đã làm việc!
Chris Rosete

2
Microsoft.Extensions.Configuration.Jsoncó một sự phụ thuộc vào Microsoft.Extensions.Configuration.FileExtensions, vì vậy bạn chỉ cần cái trước.
Johan B

Các bạn, XIN LƯU Ý, AddJsonFile("appsettings.json")phương pháp này không biết về môi trường lưu trữ của bạn! Sử dụng .AddJsonFile($"appsettings.{_hostingEnvironment.EnvironmentName}.json")thay thế. : D
Jess

Câu trả lời:


302

Các SetBasePathphương pháp mở rộng được định nghĩa trong Config.FileExtensions .

Bạn cần thêm một tham chiếu đến gói Microsoft.Extensions.Configuration.FileExtensions .

Để giải quyết AddJsonFile, thêm một tham chiếu đến Microsoft.Extensions.Configuration.Jsongói.


36
Nhưng bây giờ không tìm thấy phương thức "AddJsonFile". : DI cũng phải thêm gói này: "Microsoft.Extensions.Configuration.Json".
Tadej

5
Microsoft.Extensions.Configuration.Jsoncó một sự phụ thuộc vào Microsoft.Extensions.Configuration.FileExtensions, vì vậy bạn chỉ cần cái trước.
Johan B

61

Tôi đang phát triển ứng dụng bảng điều khiển .NET Core 2 bằng Visual Studio 2017 v15.5. Như những người khác đã lưu ý, sau khi thêm Microsoft.Extensions.Configuration tôi cần thêm Microsoft.Extensions.Configuration.Json để có được AddJsonFile()cuộc gọi hoạt động. Điều này cũng làm cho SetBasePath()cuộc gọi hoạt động; vì vậy tôi không cần thêm Cấu hình.FileExtensions . (Mã của tôi biên dịch và chạy cả có và không có nó.)

Tôi cũng đã có một cuộc gọi đến AddEnvironmentVariables(), mà tôi cần thêm Cấu hình. Môi trường. Mã của tôi là như sau:

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

Thật thú vị, usingtuyên bố duy nhất tôi cần là using Microsoft.Extensions.Configuration.


11
Câu lệnh sử dụng duy nhất cần thiết trong tệp lớp phải là Microsoft.Extensions.Configuration. Tuy nhiên, đối với dự án, bạn phải thêm một cách rõ ràng phụ thuộc NuGet "Microsoft.Extensions.Configuration.Json" thông qua tùy chọn dự án Manage NuGet Gói. Một phụ thuộc của điều này là "Microsoft.Extensions.Configuration.FileExtensions" và do đó sẽ được đưa vào như một phần của kết nối phụ thuộc. Hai phụ thuộc này sẽ giải quyết cả hai lỗi biên dịch "SetBasePath" và "AddJsonFile".
gregsonian

Thật đáng để chỉ ra rằng điều này không còn hoạt động nữa vì VS cho Mac Preview 8 đặt thư mục hiện tại thành bin / netcorzon2x
Chris Becke

Không được phạm tội nhưng Configuration.EnvironmentVariables== Microsoft.Extensions.Configuration.EnvironmentVariables. Có một số điều với tên tương tự.
Lee Richardson

12

Sử dụng cả 'Microsoft.Extensions.Configuration' và 'Microsoft.Extensions.Configuration.Json' điều này sẽ giải quyết vấn đề.

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

Đây là mẫu '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
} }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.