点网核心从单独的 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

Documentation of configuration in net