Подтвердить что ты не робот

Конфигурация ядра ASP.NET для приложения консоли .NET Core

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

Поддерживается ли эта модель также в консольных приложениях .NET Core?

Если нет того, что чередуется с предыдущей моделью app.config и ConfigurationManager?

4b9b3361

Ответ 1

Вы можете использовать этот фрагмент кода. Он включает в себя конфигурацию и 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"
    ]
  },
...
}

Ответ 2

Для консольного приложения.NET Core 2.0 я сделал следующее:

  1. Создайте новый файл с именем appsettings.json в корне проекта (имя файла может быть любым)
  2. Добавьте мои конкретные настройки в этот файл как json. Например:
{
  "myKey1" :  "my test value 1", 
  "myKey2" :  "my test value 2", 
  "foo" :  "bar" 
}
  1. Сконфигурируйте, чтобы копировать файл в выходной каталог всякий раз, когда проект создается (в VS → Solution Explorer → файл правой кнопкой мыши → выберите "Свойства" → Дополнительно → Копировать в выходной каталог → выберите "Копировать всегда")

  2. Установите следующий пакет nuget в моем проекте:

    • 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

Ответ 3

Если вы используете Microsoft.Extensions.Hosting (версия 2.1. 0+) для размещения вашего консольного приложения и основного приложения asp.net, все ваши конфигурации вводятся с HostBuilder методов HostBuilder 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" />

Ответ 4

Я ошибся. Вы можете использовать новый ConfigurationBuilder из приложения консоли netcore.

См. https://docs.asp.net/en/latest/fundamentals/configuration.html для примера.

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

Ответ 5

Я использую метод расширения, чтобы получить настройки приложения из appsettings.json. Просто используйте его следующим образом:

string path = ("Path").AppSettings();

Вот способ расширения:

private static IConfigurationRoot Configuration { get; set; }

public static string AppSettings(this string key)
{
    var config = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("appsettings.json")
                    .Build();

    return config["AppConfiguration:" + key];
}

И это пример appsettings.json:

{
  "AppConfiguration": {
    "Path": "\\\\dir\\subdir\\test"
  }
}

Ответ 6

var directoryInfo = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName).FullName;
            var builder = new ConfigurationBuilder()
                .SetBasePath(directoryInfo)
                .AddJsonFile("appsettings.json",  true, true)
                .Build();

Ответ 7

Это примерно так для консольного приложения 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.