Конфигурация ядра ASP.NET для приложения консоли .NET Core
ASP.NET Core поддерживает новую конфигурационную систему, как показано здесь:
https://docs.asp.net/en/latest/fundamentals/configuration.html
Поддерживается ли эта модель также в консольных приложениях .NET Core?
Если нет того, что чередуется с предыдущей моделью app.config
и ConfigurationManager
?
Ответы
Ответ 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 я сделал следующее:
- Создайте новый файл с именем 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#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
.