繁体   English   中英

从 appsettings.json 获取值

[英]Getting values from appsettings.json

我尝试从我的 appsettings.json 中获取价值,它是这样建模的:

 "ConfigurationModel": {
    "RfidAddress": "172.23.19.73",
    "BaudRate": "152000",
    "DataManagerTimeOut": "32000"
  }

然后我像这样创建了一个 POCO:

public class ConfigurationModel
{
    public string RfidAddress { get; set; }
    public int BaudRate { get; set; }
    public int DataManagerTimeOut { get; set; }
}

在我的 Startup.cs 中,我在服务中添加了 ConfigurationModel,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.Configure<ConfigurationModel>(Configuration.GetSection("configurationModel"));

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    services.AddSignalR();
}

我创建了一个使用此设置的类,如下所示:

public class RfidClass
{
    private readonly ConfigurationModel _configurationModel;

    public RfidClass(IOptions<ConfigurationModel> configurationModel)
    {
        _configurationModel = configurationModel.Value;
    }

    public void sas()
    {
        Console.WriteLine(_configurationModel.RfidAddress);
    }
}

然后在我的 Program.cs 中,我需要像这样调用我刚刚创建的那个类:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
        SetRfid();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();

    public static void SetRfid()
    {
        var rfidClass = new RfidClass(); <-- MISSING ARGUMENT
    }
}

如何传递所需的参数来实例化我的 RfidClass?

您应该能够通过设置 .Build() 的结果来提取值,如下所示:

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateWebHostBuilder(args).Build();
        host.Run();
        var config = host.Services.GetService<IConfiguration>();
        var configSection = config.GetSection("ConfigurationModel");
        var configModel = configSection.Get<ConfigurationModel>();
        SetRfid(configModel);
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();

    public static void SetRfid(ConfigurationModel configModel)
    {
        var rfidClass = new RfidClass(configModel); <-- ADDED
    }
}

我有点害怕说 Program 和 Startup 类不是用来做这些事情的。 通常这些操作是从一些其他类调用的,即控制器类。 发布这个,你可以使用依赖注入来传递对象。 这是执行此操作的代码:

public void ConfigureServices(IServiceCollection services) {

... services.Configure(Configuration.GetSection("configurationModel")); services.AddSingleton(m => { return new RfidClass(m.GetService>()); }); ... }

这是控制器代码:

public HomeController(ILogger<HomeController> logger, RfidClass rfidClass)
    {
        ...
    }

您似乎已正确设置所有内容以使用选项模式,但随后尝试new RfidClass而不是将选项注入到类中,如ControllerViewHandlerMiddleware 这些类是独一无二的,因为框架可以将服务注入其中。

    public class HomeController : Controller
   {

        private readonly RfidClass _rfidClass;

        public HomeController(IOptionsMonitor<ConfigurationModel> options)
        {
            _rFidClass= options.CurrentValue;
        }

        public IActionResult Index()
        {
            var rfidAddress = _rfidClass.rfidAddress;
            var baudRate = rfidClass.BaudRate;
           // do stuff.
            return View();
        }
    }

微软文档中有一些关于在此处使用选项模式的重要信息https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-3.1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM