Конфігурація ASP.NET Core для консольної програми .NET Core


135

ASP.NET Core підтримує нову систему конфігурації, як показано тут: https://docs.asp.net/en/latest/fundamentals/configuration.html

Чи підтримується ця модель також у консольних програмах .NET Core?

Якщо ні, що чергується з попередньою app.configта ConfigurationManagerмоделлю?

Відповіді:


76

Ви можете використовувати цей фрагмент коду. Він включає Конфігурація та 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>();

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

О, і не забудьте додати в 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
Ця відповідь не є ідеальною. Використовуйте Directory.GetCurrentDirectory()замість AppContext.BaseDirectory. Після цього не повинно виникати необхідності для злому.
Матяш

1
Або встановіть властивість "Копіювати у каталог виводу" значення "Копіювати, якщо новіше" у Visual Studio для файлів JSON.
BuddhiP

Для роботи базового режиму в Web, Console та Winforms ви можете використовувати такий підхід stackoverflow.com/a/33675039/1818723
Pawel Cioch

Гері Вудфін детально описав це в дуже хорошому стилі в цій публікації: garywoodfine.com/configuration-api-net-core-console-application
Javad Norouzi

@javad Лише частково; Я опинився тут, тому що хотів частину DI, яку він пообіцяв, але не знайшов. Він також не показав, як використовувати кілька конфігураційних файлів, як це робить цей приклад.
Авспекс

232

Для консольного додатка .NET Core 2.0 я зробив наступне:

  1. Створіть новий файл з назвою appsettings.json в корені проекту (ім'я файлу може бути будь-яким)
  2. Додайте мої конкретні налаштування до цього файлу як json. Наприклад:
{
  "myKey1" :  "my test value 1", 
  "myKey2" :  "my test value 2", 
  "foo" :  "bar" 
}
  1. Налаштуйте, щоб скопіювати файл у вихідний каталог кожного разу, коли проект створений (у VS -> Провідник рішень -> файл правою кнопкою миші -> виберіть "Властивості" -> Додатково -> Копіювати у вихідний каталог -> виберіть "Копіювати завжди")

  2. Встановіть у своєму проекті наступний пакунок:

    • Microsoft.Extensions.Configuration.Json
  3. Додайте наступне до Program.cs (або де б Main()не було):

    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json");
    
        var configuration = builder.Build();
    
        // rest of code...
    }
  4. Потім прочитайте значення, використовуючи один із наступних способів:

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

Докладніше: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration?tabs=basicconfiguration#simple-configuration


1
Як я помітив, Microsoft не використовує IConfigurationRoot у своїх прикладах, а використовує IConfiguration.
алігін

3
IConfigurationRootвсе ще доступний у .NET Core 2.0 . Він успадковується від, IConfigurationале вважається похідним випадком цього, який не використовується зазвичай . Незважаючи на те, приклад коду було оновлено, щоб не включати його та уникати будь-якої плутанини.
Рей

10
2 зауваження: у пункті 4 вам потрібен лише Microsoft.Extensions.Configuration.Json ... До нього будуть включені інші 2 за замовчуванням. Друге: Якщо ви хочете завантажити розділ на об’єкт, корисно знати: var options = new FooOptions (); ConfigurationBinder.Bind (configuration.GetSection ("foo"), параметри); Вам знадобиться Microsoft.Extensions.Options.ConfigurationExtensions
Yepeekai

1
FooOptions публічного класу {public string myKey1 {get; set;} public string myKey2 {get; set;}}
Yepeekai

2
Інструменти> Менеджер пакунків NuGet> Консоль диспетчера пакунків .. .. Встановити-пакет Microsoft.Extensions.Configuration .. Встановити-пакет Microsoft.Extensions.Configuration.FileExtensions .. Встановити-пакет Microsoft.Extensions.Configuration.Json
Manohar Reddy Poreddy

19

Якщо ви використовуєте Microsoft.Extensions.Hosting(версія 2.1.0+) для розміщення консольного додатка та основного додатка asp.net, всі ваші конфігурації вводяться за допомогою HostBuilder's ConfigureAppConfigurationта ConfigureHostConfigurationметодів. Ось демонстрація про те, як додати appsettings.jsonзмінні та середовище:

    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
        //;

Для того, щоб скласти вищезгаданий код, вам потрібно додати ці пакунки:

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

Як визначається середовище? Якщо я створюю профіль у запускуНастройки, він насправді встановлюється, ASPNETCORE_ENVIRONMENTале потім context.HostingEnvironment.EnvironmentNameне встановлюється правильно
Sinaesthetic

Ви повинні використовувати середовище як ключ, перевірте цей код: github.com/aspnet/Hosting/blob/dev/src/…
Feiyu Zhou

@FeiyuZhou , що мертва посилання
Одкровення

Чи не все це рішення є new HostBuilder()надлишковим? Все HostBuilderце все не робить?
Auspex

@Auspex Це залежить від того, як ви визначаєте консольний додаток. Якщо вам потрібно визначити власні конфігурації, вам слід встановити так. Ось документ для ядра dotnet
Feiyu Zhou

10

Я помилився. Ви можете використовувати нове ConfigurationBuilderв додатку для консолі netcore.

Див. Https://docs.asp.net/en/latest/fundamentals/configuration.html для прикладу.

Однак тільки ядро ​​aspnet має введення залежностей з коробки, тому у вас немає можливості сильно набрати налаштування конфігурації та автоматично ввести їх за допомогою IOptions.


9
Ця відповідь є дійсною, але вона повинна містити необхідний код, таким чином, не буде підтверджено.
Матяш

4
Все, що вам потрібно, це додати пакет: Microsoft.Extensions.Optionsта зателефонуватиservice.AddOptions();
Бруно Гарсія

2
Вся (дуже довга) пов’язана сторінка, схоже, пов’язана з ASP.NET, із зазначенням "WebHost" у кожному прикладі. Я дійшов до цього питання ТАК, знайшовши пов’язану сторінку та подумавши "добре, це ASP.NET, що ж із програмами Console Apps".
mackenir

Це трохи дивно, @mackenir, адже в 3.0 це все було відремонтоване так, що все просто Хост! Єдине посилання на сам WebHost - це вказівка ​​на документацію 2.2. Вони могли бути трохи зрозумілішими, що ConfigureWebHostDefaults()дзвінки в прикладах необов’язкові і стосуються лише веб-додатків.
Auspex

4

Це приблизно так, для додаткового ядра консолі 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();

Ви можете ввести ILoggerFactory, IConfiguration у програмі SomeService.


2

У .Net Core 3.1 нам просто потрібно зробити це:

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

Використання SeriLog виглядатиме так:

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

І розділ Serilog appsetings.json для генерування одного файлу щодня виглядатиме так:

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

спробувавши всі ці синтаксиси з усієї мережі, ваш працює для мене, і це так просто.
GaneshT

Я радий, що це допомогло тобі.
Ернест

1

Для цього можна використовувати бібліотеку LiteWare.Configuration . Він дуже схожий на оригінальний .NET Framework ConfigurationManagerі працює для .NET Core / Standard. Що стосується коду, ви отримаєте щось на зразок:

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

Відмова: Я є автором LiteWare.Configuration.


0

Просто набираю ... схожий на пост Фейю Чжоу. Тут я додаю назву машини.

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

Встановіть ці пакети:

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Binder
  • Microsoft.Extensions.Configuration.El EnvironmentVariables
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.Configuration.Json

Код:

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

Клас MySettingsConfig:

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

Ваші програми можуть бути такими ж простими: введіть тут опис зображення

Крім того, встановіть файли програм на Вміст / Копіювати, якщо новіші: зміст

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.