点网核心从单独的 class 调用应用程序设置
dot net core call appsettings from seperate class
前几天我在看 dotnet core,我正在测试如何调用 appsettings.json
到一般逻辑。
这按预期工作,但要放入的代码很多,所以我想
我用一个参数创建了一个 class 来读取部分名称,但出于某种原因,此 returns 为空。
using System;
using System.IO;
using Microsoft.Extensions.Configuration;
namespace base_ftp
{
public class ConfigBuild
{
static AppSettings appSettings = new AppSettings();
public void Now(string sectionname)
{
Console.Write(sectionname);
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
var configuration = builder.Build();
ConfigurationBinder.Bind(configuration.GetSection(sectionname), appSettings);
}
}
}
在 appsettings.json 我有类似的东西
"FtpSettings": {
"FTP_SERVER": "xyz"
},
"Mailsettings": {
"MAIL_SERVER": "xyz"
}
我在主函数中这样调用它
string new_section = "FtpSettings";
ConfigBuild cnf = new ConfigBuild();
cnf.Now(sectionname:new_sectonname);
我忽略了什么?
我可能误解了你的问题,因为我没有理解你上一个代码块中的重点,但据我所知,我认为这会对你有所帮助:
public class ConfigBuild
{
private readonly IConfiguration _configuration;
public ConfigBuild()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
// create your 'IConfiguration' just once because you have already said it should 'reloadOnChange'
_configuration = builder.Build();
}
public FtpSettings GetFtpSettings()
{
// Quick access method for your sections
return GetSection<FtpSettings>(FtpSettings.SECTION_NAME);
}
public MailSettings GetMailSettings()
{
// Quick access method for your sections
return GetSection<MailSettings>(MailSettings.SECTION_NAME);
}
public T GetSection<T>(string sectionName)
where T : class, new()
{
// Access the sections in your 'IConfiguration' and bind them to a generic object. Generic because it can be used also for future sections.
Console.WriteLine("SectionName: " + sectionName);
return _configuration.GetSection(sectionName).Get<T>();
}
}
// Model classes to bind your section to:
public class FtpSettings
{
public static readonly string SECTION_NAME = "FtpSettings";
public string FTP_SERVER { get; set; }
}
public class MailSettings
{
public static readonly string SECTION_NAME = "Mailsettings";
public string MAIL_SERVER { get; set; }
}
在这里您可以找到一个工作示例:dotnet-fiddle
前几天我在看 dotnet core,我正在测试如何调用 appsettings.json
到一般逻辑。
这按预期工作,但要放入的代码很多,所以我想 我用一个参数创建了一个 class 来读取部分名称,但出于某种原因,此 returns 为空。
using System;
using System.IO;
using Microsoft.Extensions.Configuration;
namespace base_ftp
{
public class ConfigBuild
{
static AppSettings appSettings = new AppSettings();
public void Now(string sectionname)
{
Console.Write(sectionname);
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
var configuration = builder.Build();
ConfigurationBinder.Bind(configuration.GetSection(sectionname), appSettings);
}
}
}
在 appsettings.json 我有类似的东西
"FtpSettings": {
"FTP_SERVER": "xyz"
},
"Mailsettings": {
"MAIL_SERVER": "xyz"
}
我在主函数中这样调用它
string new_section = "FtpSettings";
ConfigBuild cnf = new ConfigBuild();
cnf.Now(sectionname:new_sectonname);
我忽略了什么?
我可能误解了你的问题,因为我没有理解你上一个代码块中的重点,但据我所知,我认为这会对你有所帮助:
public class ConfigBuild
{
private readonly IConfiguration _configuration;
public ConfigBuild()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
// create your 'IConfiguration' just once because you have already said it should 'reloadOnChange'
_configuration = builder.Build();
}
public FtpSettings GetFtpSettings()
{
// Quick access method for your sections
return GetSection<FtpSettings>(FtpSettings.SECTION_NAME);
}
public MailSettings GetMailSettings()
{
// Quick access method for your sections
return GetSection<MailSettings>(MailSettings.SECTION_NAME);
}
public T GetSection<T>(string sectionName)
where T : class, new()
{
// Access the sections in your 'IConfiguration' and bind them to a generic object. Generic because it can be used also for future sections.
Console.WriteLine("SectionName: " + sectionName);
return _configuration.GetSection(sectionName).Get<T>();
}
}
// Model classes to bind your section to:
public class FtpSettings
{
public static readonly string SECTION_NAME = "FtpSettings";
public string FTP_SERVER { get; set; }
}
public class MailSettings
{
public static readonly string SECTION_NAME = "Mailsettings";
public string MAIL_SERVER { get; set; }
}
在这里您可以找到一个工作示例:dotnet-fiddle