以下是Microsoft 文档中的示例代码,显示了如何在控制台应用程序中使用 appsettings.json:
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
namespace ConsoleJson.Example
{
class Program
{
static async Task Main(string[] args)
{
using IHost host = CreateHostBuilder(args).Build();
// Application code should start here.
await host.RunAsync();
}
static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, configuration) =>
{
configuration.Sources.Clear();
IHostEnvironment env = hostingContext.HostingEnvironment;
configuration
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true);
IConfigurationRoot configurationRoot = configuration.Build();
TransientFaultHandlingOptions options = new();
configurationRoot.GetSection(nameof(TransientFaultHandlingOptions))
.Bind(options);
Console.WriteLine($"TransientFaultHandlingOptions.Enabled={options.Enabled}");
Console.WriteLine($"TransientFaultHandlingOptions.AutoRetryDelay={options.AutoRetryDelay}");
});
}
}
Run Code Online (Sandbox Code Playgroud)
我需要在另一个类的方法中获取配置值,如下所示。我想我会需要使用依赖注入,并发送IConfigurationRoot至myClass如图这个链接,但无法弄清楚到底如何?
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
namespace ConsoleJson.Example
{
class Program
{
static void Main(string[] args)
{
using IHost host = CreateHostBuilder(args).Build();
IDatabase db = xyz.GetDatabase();
ConfigureServices.Initialize(db);
}
static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, configuration) =>
{
configuration.Sources.Clear();
IHostEnvironment env = hostingContext.HostingEnvironment;
configuration
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true);
IConfigurationRoot configurationRoot = configuration.Build();
TransientFaultHandlingOptions options = new();
configurationRoot.GetSection(nameof(TransientFaultHandlingOptions))
.Bind(options);
});
}
class ConfigureServices
{ public static void Initialize(IDatabase db)
{
Console.WriteLine($"TransientFaultHandlingOptions.Enabled={options.Enabled}");
Console.WriteLine($"TransientFaultHandlingOptions.AutoRetryDelay={options.AutoRetryDelay}");
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我需要从中获取值appsettings.json并在我的 Initialize 方法中使用它们。我可以通过对值进行硬编码来使用其余的代码。
我尝试在 ConfigureAppConfiguration 之后添加以下行,但无法识别 configurationRoot
.ConfigureServices((_, services) =>services.AddSingleton<IConfigurationRoot>(configurationRoot));
Run Code Online (Sandbox Code Playgroud)
真诚地感谢所有帮助。谢谢
我也有类似的情况。我想将 AppSettings.Json 自定义键访问到我的 asp.net core mvc 项目的控制器中。我正在分享控制台应用程序示例代码,可能对您有帮助。
我使用了标准 VS 2019 控制台应用程序模板和 asp.net core,目标为 .net 5.0。
我的项目文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.6" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="5.0.0" />
<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.MSSqlServer" Version="5.6.0" />
</ItemGroup>
<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
我的 AppSettings.Json 是:
{
"AppSettings": {
"FTPLocation": "\\\\FTPHostname\\\\c$\\\\Folder\\\\ftpSite\\\\Prod\\",
"FTPUri": "ftp://ftphostname/myFolder/",
"CSVFileName": "TestData.csv",
},
"ConnectionStrings": {
"AppDbConnString": "Server=sqlserverhost.domain.com;Database=DBName; Trusted_Connection=True; MultipleActiveResultSets=true"
,
"IdentityConnection": "Server=hostname.domain.com;Database=IdentityDBName; Trusted_Connection=True; MultipleActiveResultSets=true"
},
"EmailAddresses": [
"email1@test.com",
"email2@test.com",
"email3@test.com"
],
"Logging": {
"LogLevel": {
"Default": "Warning"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的 Program.cs 是:
using System;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Serilog;
using Microsoft.Extensions.Logging;
using System.IO;
namespace AppSettingsExample
{
class Program
{
public static IConfigurationRoot configuration;
static void Main(string[] args)
{
ServiceCollection serviceDescriptors = new ServiceCollection();
ConfigureServices(serviceDescriptors);
Serilog.Log.Information("Building service provider");
IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
Console.WriteLine(configuration.GetConnectionString("AppDbConnString"));
try
{
Serilog.Log.Information("start service provider");
_ = serviceProvider.GetService<App>().Run();
Serilog.Log.Information("end service provider");
}
catch (Exception ex)
{
Serilog.Log.Fatal(ex, "Error in building service ");
throw;
}
finally
{
Serilog.Log.CloseAndFlush();
}
var connectionString = configuration.GetSection("ConnectionStrings:AppDbConnString").Value;
Console.WriteLine(connectionString);
var securityGroups = configuration.GetSection("ADSecurityGroups:SupervisorSecurityGroups").Value.Split(';');
foreach (var securityGroup in securityGroups)
{
Console.WriteLine(securityGroup);
}
}
private static void ConfigureServices(IServiceCollection serviceCollection)
{
serviceCollection.AddSingleton(LoggerFactory.Create(builder =>
{
builder.AddSerilog(dispose: true);
}));
serviceCollection.AddLogging();
configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetParent(AppContext.BaseDirectory).FullName)
.AddJsonFile("appsettings.json")
.Build();
serviceCollection.AddSingleton<IConfigurationRoot>(configuration);
serviceCollection.AddTransient<App>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的 App.cs 是:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AppSettingsExample
{
public class App
{
private readonly IConfigurationRoot _config;
private readonly ILogger<App> _logger;
public App(IConfigurationRoot config, ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<App>();
_config = config;
}
public async Task Run()
{
List<string> emailAddresses = _config.GetSection("EmailAddresses").Get<List<string>>();
foreach (string emailAddress in emailAddresses)
{
Console.WriteLine(emailAddress);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
该控制台应用程序的输出: