簡體   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