Cấu hình ASP.NET Core cho ứng dụng bảng điều khiển .NET Core


135

ASP.NET Core hỗ trợ một hệ thống cấu hình mới như được thấy ở đây: https://docs.asp.net/en/latest/fundamentals/configuration.html

Có phải mô hình này cũng được hỗ trợ trong các ứng dụng bảng điều khiển .NET Core?

Nếu không những gì là thay thế cho trước đó app.configConfigurationManagermô hình?

Câu trả lời:


76

Bạn có thể sử dụng đoạn mã này. Nó bao gồm Cấu hình và DI.

public class Program
{
    public static ILoggerFactory LoggerFactory;
    public static IConfigurationRoot Configuration;

    public static void Main(string[] args)
    {
        Console.OutputEncoding = Encoding.UTF8;

        string environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

        if (String.IsNullOrWhiteSpace(environment))
            throw new ArgumentNullException("Environment not found in ASPNETCORE_ENVIRONMENT");

        Console.WriteLine("Environment: {0}", environment);

        var services = new ServiceCollection();

        // Set up configuration sources.
        var builder = new ConfigurationBuilder()
            .SetBasePath(Path.Combine(AppContext.BaseDirectory))
            .AddJsonFile("appsettings.json", optional: true);
        if (environment == "Development")
        {

            builder
                .AddJsonFile(
                    Path.Combine(AppContext.BaseDirectory, string.Format("..{0}..{0}..{0}", Path.DirectorySeparatorChar), $"appsettings.{environment}.json"),
                    optional: true
                );
        }
        else
        {
            builder
                .AddJsonFile($"appsettings.{environment}.json", optional: false);
        }

        Configuration = builder.Build();

        LoggerFactory = new LoggerFactory()
            .AddConsole(Configuration.GetSection("Logging"))
            .AddDebug();

        services
            .AddEntityFrameworkNpgsql()
            .AddDbContext<FmDataContext>(o => o.UseNpgsql(connectionString), ServiceLifetime.Transient);

        services.AddTransient<IPackageFileService, PackageFileServiceImpl>();

        var serviceProvider = services.BuildServiceProvider();

        var packageFileService = serviceProvider.GetRequiredService<IPackageFileService>();

        ............
    }
}

Ồ, và đừng quên thêm vào project.json

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true,
    "copyToOutput": {
      "includeFiles": [
        "appsettings.json",
        "appsettings.Integration.json",
        "appsettings.Production.json",
        "appsettings.Staging.json"
      ]
    }
  },

  "publishOptions": {
    "copyToOutput": [
      "appsettings.json",
      "appsettings.Integration.json",
      "appsettings.Production.json",
      "appsettings.Staging.json"
    ]
  },
...
}

12
Câu trả lời này không lý tưởng. Sử dụng Directory.GetCurrentDirectory()thay vì AppContext.BaseDirectory. Không cần phải hack sau đó.
Matyas

1
Hoặc đặt thuộc tính "Sao chép vào thư mục đầu ra" thành "Sao chép nếu mới hơn" trong Visual Studio cho các tệp JSON.
BuddhiP

Để thư mục cơ sở hoạt động trên Web, Bảng điều khiển và Winforms, bạn có thể sử dụng phương pháp này stackoverflow.com/a/33675039/1818723
Pawel Cioch

Gary Woodfine đã mô tả chi tiết này theo một phong cách rất hay trên bài đăng này: garywoodfine.com/configuration-api-net-core-console-application
Javad Norouzi

@javad Chỉ một phần; Tôi đã kết thúc ở đây vì tôi muốn phần DI, mà anh ấy đã hứa nhưng tôi không tìm thấy. Anh ta cũng không chỉ ra cách sử dụng nhiều tập tin cấu hình như ví dụ này.
Auspex

231

Đối với ứng dụng bảng điều khiển .NET Core 2.0, tôi đã làm như sau:

  1. Tạo một tệp mới có tên appsinstall.json ở thư mục gốc của dự án (tên tệp có thể là bất cứ thứ gì)
  2. Thêm cài đặt cụ thể của tôi vào tập tin đó là json. Ví dụ:
{
  "myKey1" :  "my test value 1", 
  "myKey2" :  "my test value 2", 
  "foo" :  "bar" 
}
  1. Định cấu hình để sao chép tệp vào thư mục đầu ra bất cứ khi nào dự án được xây dựng (trong VS -> Solution Explorer -> nhấp chuột phải vào tệp -> chọn 'Thuộc tính' -> Nâng cao -> Sao chép vào Thư mục đầu ra -> chọn 'Sao chép luôn')

  2. Cài đặt gói nuget sau trong dự án của tôi:

    • Microsoft.Extensions.Configuration.Json
  3. Thêm phần sau vào Program.cs (hoặc bất cứ nơi nào Main()được đặt):

    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json");
    
        var configuration = builder.Build();
    
        // rest of code...
    }
  4. Sau đó đọc các giá trị bằng một trong các cách sau:

    string myKey1 = configuration["myKey1"];
    Console.WriteLine(myKey1);
    
    string foo = configuration.GetSection("foo").Value;
    Console.WriteLine(foo);

Thông tin thêm: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration?tabs=basicconfiguration#simple-configuration


1
Như tôi nhận thấy Microsoft không sử dụng IConfigurationRoot trong các ví dụ của họ, mà sử dụng cấu hình IConfiguration.
bắt đầu

3
IConfigurationRootvẫn có sẵn trong .NET Core 2.0 . Nó thừa hưởng từ IConfigurationnhưng nó được coi là trường hợp xuất phát của nó không được sử dụng phổ biến . Bất kể, ví dụ mã đã được cập nhật để không bao gồm nó và tránh bất kỳ sự nhầm lẫn.
Ray

10
2 lưu ý: trên điểm 4, bạn chỉ cần Microsoft.Extensions.Configuration.Json ... Nó sẽ bao gồm 2 cái còn lại theo mặc định. Thứ hai: Nếu bạn muốn tải một phần vào một đối tượng, sẽ rất hữu ích khi biết: var Options = new FooOptions (); Cấu hìnhBinder.Bind (configure.GetSection ("foo"), tùy chọn); Bạn sẽ cần Microsoft.Extensions.Options.ConfigurationExtensions
Yepeekai

1
lớp công khai FooOptions {chuỗi công khai myKey1 {get; set;} chuỗi công khai myKey2 {get; set;}}
Yepeekai

2
Công cụ> NuGet Package Manager> Package Manager Console .. .. Install-Package Microsoft.Extensions.Configuration .. Install-Package Microsoft.Extensions.Configuration.FileExtensions .. Install-Package Microsoft.Extensions.Configuration.Json
Manohar Reddy Poreddy

19

Nếu bạn sử dụng Microsoft.Extensions.Hosting(phiên bản 2.1.0+) để lưu trữ ứng dụng bảng điều khiển và ứng dụng lõi asp.net, tất cả các cấu hình của bạn sẽ được thêm vào bằng HostBuildercác phương thức ConfigureAppConfigurationConfigureHostConfigurationphương thức. Đây là bản demo về cách thêm các appsettings.jsonbiến và môi trường:

    var hostBuilder = new HostBuilder()
        .ConfigureHostConfiguration(config =>
        {
            config.AddEnvironmentVariables();

            if (args != null)
            {
                // enviroment from command line
                // e.g.: dotnet run --environment "Staging"
                config.AddCommandLine(args);
            }
        })
        .ConfigureAppConfiguration((context, builder) =>
        {
            var env = context.HostingEnvironment;
            builder.SetBasePath(AppContext.BaseDirectory)
            .AddJsonFile("appsettings.json", optional: false)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            // Override config by env, using like Logging:Level or Logging__Level
            .AddEnvironmentVariables();

        })
        ... // add others, logging, services
        //;

Để biên dịch mã ở trên, bạn cần thêm các gói sau:

<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.1.0" />

Môi trường được xác định như thế nào? Nếu tôi tạo một hồ sơ trong launchSinstall, nó thực sự sẽ được đặt ASPNETCORE_ENVIRONMENTnhưng sau đó context.HostingEnvironment.EnvironmentNamekhông được đặt chính xác
Sina Architectural

Bạn nên sử dụng môi trường làm khóa, kiểm tra mã này: github.com/aspnet/hosting/blob/dev/src/ Kẻ
Feiyu Zhou

@FeiyuZhou đó là một liên kết chết
Auspex

Không phải tất cả các giải pháp này sau khi new HostBuilder()dư thừa? Không HostBuilderlàm tất cả trong nội bộ?
Auspex

@Auspex Nó phụ thuộc vào cách bạn xác định ứng dụng bảng điều khiển của mình. Nếu bạn cần xác định cấu hình tùy chỉnh thì bạn nên đặt như thế này. Đây là tài liệu cho lõi dotnet 3.0: docs.microsoft.com/en-us/aspnet/core/fundamentals/host/ chủ
Feiyu Zhou

10

Tôi đã lầm. Bạn có thể sử dụng mới ConfigurationBuildertừ một ứng dụng bảng điều khiển netcore.

Xem https://docs.asp.net/en/latest/fundamentals/configuration.html để biết ví dụ.

Tuy nhiên, chỉ lõi aspnet có tính năng tiêm phụ thuộc ra khỏi hộp để bạn không có khả năng gõ mạnh các cài đặt cấu hình và tự động tiêm chúng bằng cách sử dụng IOptions.


9
Câu trả lời này là hợp lệ, nhưng nó nên chứa mã cần thiết, do đó không có upvote.
Matyas

4
Tất cả những gì bạn cần là thêm gói: Microsoft.Extensions.Optionsvà gọiservice.AddOptions();
Bruno Garcia

2
Toàn bộ trang được liên kết (rất dài) dường như có liên quan đến ASP.NET, với đề cập đến "Webhost" trong mọi ví dụ. Tôi đã nhận được câu hỏi SO này sau khi tìm thấy trang được liên kết và nghĩ rằng "ok, đó là ASP.NET, còn về Ứng dụng Console".
mackenir

Điều đó hơi kỳ lạ, @mackenir, bởi vì trong 3.0, tất cả đã được tái cấu trúc để tất cả chỉ là Máy chủ! Tham chiếu duy nhất đến chính Webhost là chỉ cho bạn tài liệu 2.2. Họ có thể đã rõ ràng hơn một chút rằng các ConfigureWebHostDefaults()cuộc gọi trong các ví dụ là tùy chọn và chỉ dành cho các ứng dụng Web.
Auspex

4

Nó giống như thế này, đối với ứng dụng bảng điều khiển lõi dotnet 2.x:

        using Microsoft.Extensions.Configuration;
        using Microsoft.Extensions.DependencyInjection;
        using Microsoft.Extensions.Logging;

        [...]
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();
        var serviceProvider = new ServiceCollection()
            .AddLogging(options => options.AddConfiguration(configuration).AddConsole())
            .AddSingleton<IConfiguration>(configuration)
            .AddSingleton<SomeService>()
            .BuildServiceProvider();
        [...]
        await serviceProvider.GetService<SomeService>().Start();

Bạn có thể tiêm ILoggerFactory, IConfiguration trong SomeService.


2

Trên .Net Core 3.1, chúng ta chỉ cần thực hiện những điều sau:

static void Main(string[] args)
{
  var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
}

Sử dụng SeriLog sẽ như sau:

using Microsoft.Extensions.Configuration;
using Serilog;
using System;


namespace yournamespace
{
    class Program
    {

        static void Main(string[] args)
        {
            var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
            Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger();

            try
            {
                Log.Information("Starting Program.");
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "Program terminated unexpectedly.");
                return;
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }
    }
}

Và phần ứng dụng Serilog appsetings.json để tạo một tệp hàng ngày sẽ như sau:

  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "C:\\Logs\\Program.json",
          "rollingInterval": "Day",
          "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
        }
      }
    ]
  }

sau khi thử tất cả các cú pháp từ khắp nơi trên web, cái của bạn là cái phù hợp với tôi và nó thật đơn giản.
GaneshT

Tôi rất vui vì nó đã giúp bạn ra ngoài.
Ernest

1

Bạn có thể sử dụng thư viện LiteWare.Configuration cho điều đó. Nó rất giống với .NET Framework gốc ConfigurationManagervà hoạt động cho .NET Core / Standard. Thông thái mã, bạn sẽ kết thúc với một cái gì đó như:

string cacheDirectory = ConfigurationManager.AppSettings.GetValue<string>("CacheDirectory");
ulong cacheFileSize = ConfigurationManager.AppSettings.GetValue<ulong>("CacheFileSize");

Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của LiteWare.Configuration.


0

Chỉ cần chồng chất lên ... tương tự như bài của Feiyu Zhou. Ở đây tôi đang thêm tên máy.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
          .ConfigureAppConfiguration((context, builder) =>
          {
            var env = context.HostingEnvironment;
            var hostname = Environment.MachineName;
            builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
              .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
              .AddJsonFile($"appsettings.{hostname}.json", optional: true, reloadOnChange: true);
            builder.AddEnvironmentVariables();
            if (args != null)
            {
              builder.AddCommandLine(args);
            }
          })
        .UseStartup<Startup>();
  }

0

Cài đặt các gói này:

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Binder
  • Microsoft.Extensions.Configuration.En Môi trường Biến
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.Configuration.Json

Mã số:

static void Main(string[] args)
    {
        var environmentName = Environment.GetEnvironmentVariable("ENVIRONMENT");
        Console.WriteLine("ENVIRONMENT: " + environmentName);

        var builder = new ConfigurationBuilder()
           .SetBasePath(Directory.GetCurrentDirectory())
           .AddJsonFile("appsettings.json", false)
           .AddJsonFile($"appsettings.{environmentName}.json", true)
           .AddEnvironmentVariables();

        IConfigurationRoot configuration = builder.Build();
        var mySettingsConfig = configuration.Get<MySettingsConfig>();

        Console.WriteLine("URL: " + mySettingsConfig.Url);
        Console.WriteLine("NAME: " + mySettingsConfig.Name);

        Console.ReadKey();
    }

Lớp MySinstallConfig:

public class MySettingsConfig
{
    public string Url { get; set; }
    public string Name { get; set; }
}

Cài đặt ứng dụng của bạn có thể đơn giản như thế này: nhập mô tả hình ảnh ở đây

Ngoài ra, đặt tệp cài đặt ứng dụng thành Nội dung / Sao chép nếu mới hơn: Nội dung

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.