Конфигурация ASP.NET Core для консольного приложения.NET Core
ASP.NET Core поддерживает новую систему конфигурации, как показано здесь: https://docs.asp.net/en/latest/fundamentals/configuration.html
Эта модель также поддерживается в консольных приложениях.NET Core?
Если нет то, что является альтернативой предыдущему app.config
а также ConfigurationManager
модель?
12 ответов
Вы можете использовать этот фрагмент кода. Включает в себя конфигурацию и 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"
]
},
...
}
Для консольного приложения.NET Core 2.0 я сделал следующее:
- Создайте новый файл с именем appsettings.json в корне проекта (имя файла может быть любым)
- Добавьте мои конкретные настройки в этот файл как json. Например:
{ "myKey1" : "my test value 1", "myKey2" : "my test value 2", "foo" : "bar" }
Сконфигурируйте, чтобы копировать файл в выходной каталог при каждом построении проекта (в VS -> Solution Explorer -> файл правой кнопкой мыши -> выберите "Свойства" -> "Дополнительно" -> "Копировать в выходной каталог" -> выберите "Копировать всегда")
Установите следующий пакет nuget в моем проекте:
- Microsoft.Extensions.Configuration.Json
Добавьте следующее в 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... }
Затем прочитайте значения одним из следующих способов:
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
Если вы используете 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" />
В.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"
}
}
]
}
Я ошибался. Вы можете использовать новый ConfigurationBuilder
из консольного приложения Netcore.
См. Пример https://docs.asp.net/en/latest/fundamentals/configuration.html.
Тем не менее, только ядро aspnet имеет возможность внедрения зависимостей из коробки, поэтому у вас нет возможности иметь строго типизированные параметры конфигурации и автоматически внедрять их, используя IOptions
,
Если вы используете.netcore 3.1, самый простой способ - использовать новую систему конфигурации для вызова CreateDefaultBuilder
метод статического класса Host
и настроить приложение
public class Program
{
public static void Main(string[] args)
{
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
IHostEnvironment env = context.HostingEnvironment;
config.AddEnvironmentVariables()
// copy configuration files to output directory
.AddJsonFile("appsettings.json")
// default prefix for environment variables is DOTNET_
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddCommandLine(args);
})
.ConfigureServices(services =>
{
services.AddSingleton<IHostedService, MySimpleService>();
})
.Build()
.Run();
}
}
class MySimpleService : IHostedService
{
public Task StartAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StartAsync");
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StopAsync");
return Task.CompletedTask;
}
}
Вам нужно установить Копировать в выходной каталог = 'Копировать, если новее' для файлов. appsettings.json
а также appsettings.{environment}.json
Также вы можете установить переменную среды {prefix}ENVIRONMENT (префикс по умолчанию - DOTNET), чтобы можно было выбрать определенные параметры конфигурации.
.csproj файл:
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>ConsoleApplication3</RootNamespace>
<AssemblyName>ConsoleApplication3</AssemblyName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.7" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.7" />
</ItemGroup>
<ItemGroup>
<None Update="appsettings.Development.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
Для основного консольного приложения 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
.
Установите эти пакеты:
- Microsoft.Extensions.Configuration
- Microsoft.Extensions.Configuration.Binder
- Microsoft.Extensions.Configuration.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; }
}
Настройки вашего приложения могут быть такими простыми:
Кроме того, установите для файлов appsettings значение Content / Copy, если они новее:
Другие решения работают, но не в том случае, если вы хотите ввести
IConfigurationRoot
в других сервисах. Я просто сделал это так:
Установить
Microsoft.Extensions.Configuration.Json
тогда
static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddSingleton(_ =>
new ConfigurationBuilder()
.SetBasePath(Path.Combine(AppContext.BaseDirectory))
.AddJsonFile("appsettings.json", optional: true)
.Build())
.BuildServiceProvider();
// Rest of code ...
}
а в других сервисах его вкалывать или использовать
serviceProvider.GetService<IConfigurationRoot>()
Просто накапливаю... похоже на пост Фэйю Чжоу. Здесь я добавляю имя машины.
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>();
}
Для этого можно использовать библиотеку https://github.com/samsam07/LiteWare.Configuration. Он очень похож на оригинал.NET FrameworkConfigurationManager
и работает для.NET Core/Standard. С точки зрения кода вы получите что-то вроде:
string cacheDirectory = ConfigurationManager.AppSettings.GetValue<string>("CacheDirectory");
ulong cacheFileSize = ConfigurationManager.AppSettings.GetValue<ulong>("CacheFileSize");
Отказ от ответственности: я являюсь автором LiteWare.Configuration.
var directoryInfo = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName).FullName;
var builder = new ConfigurationBuilder()
.SetBasePath(directoryInfo)
.AddJsonFile("appsettings.json", true, true)
.Build();