【问题标题】:Injecting Application Settings into Azure Functions v3.0 using IOptions<>使用 IOptions<> 将应用程序设置注入 Azure Functions v3.0
【发布时间】:2020-11-28 16:22:22
【问题描述】:

如何使用 IOptions 将应用程序设置注入 Azure Functions v3.0

总是获取 JwtIssuerOptions 空值

说我们的设置文件,local.settings.json 包含以下数据:

 {
  "IsEncrypted": false,
 "Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"SqlConnectionString": "Server"
},
"JwtIssuerOptions": {
"JwtKey": "rpqru",
"JwtIssuer": "mydomain",
"JwtExpireDays": 7,
"JwtExpireMinutes": 240,
"JwtAuidence": "localhost"
  }
}

函数启动

公共类启动:FunctionsStartup {

  public override void Configure(IFunctionsHostBuilder builder)
    {
        var localConfig = new ConfigurationBuilder()
             .SetBasePath(Environment.CurrentDirectory)
             .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
           .AddEnvironmentVariables()
           .Build();           
        builder.Services.AddOptions<JwtIssuerOptions>().Configure<IConfiguration>((settings, configuration) =>
        {
            configuration.Bind("JwtIssuerOptions", settings);
        });
    }

JwtIssuerOptions 类如下所示

public class JwtIssuerOptions

  {
        
    public string JwtKey { get; set; }

    public string JwtIssuer { get; set; }

    public int JwtExpireDays { get; set; }

    public int JwtExpireMinutes { get; set; }

    public string JwtAuidence { get; set; }
}

类似下面的函数

   public class MyFunctions
   
 {

  private readonly IOptions<JwtIssuerOptions> _options;

  public MyFunctions(IOptions<ApplicationSettings> applicationSettingsOptions, 
  IOptions<JwtIssuerOptions>  options)
  {
 // the named section of the configuration file "JwtIssuerOptions"
  _options;= options;
   }

   }

【问题讨论】:

    标签: .net-core dependency-injection azure-functions serverless azure-function-app


    【解决方案1】:

    使用构建的本地配置中的部分配置所需的选项

    函数启动

    public override void Configure(IFunctionsHostBuilder builder) {
        IConfiguration localConfig = new ConfigurationBuilder()
             .SetBasePath(Environment.CurrentDirectory)
             .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
           .AddEnvironmentVariables()
           .Build();
           
        builder.Services
            .Configure<JwtIssuerOptions>(localConfig.GetSection("JwtIssuerOptions"));
    }
    

    另一种方法是获取本地设置,将其添加到容器中

    FunctionsStartup {
        public override void Configure(IFunctionsHostBuilder builder) {
            IConfiguration localConfig = new ConfigurationBuilder()
                 .SetBasePath(Environment.CurrentDirectory)
                 .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
               .AddEnvironmentVariables()
               .Build();
            //load setting
            JwtIssuerOptions jwt = localConfig.GetSection("JwtIssuerOptions").Get<JwtIssuerOptions>();
            //register with container
            builder.Services.AddSingleton<JwtIssuerOptions>(jwt);
        }
    }
    

    并将其显式注入函数中

    public class MyFunctions {
    
        private readonly JwtIssuerOptions jwtOptions;
    
        public MyFunctions(IOptions<ApplicationSettings> applicationSettingsOptions, 
            JwtIssuerOptions jwtOptions) {
            this.jwtOptions = jwtOptions;
    
            //...
        }
        
        //...
    }
    

    【讨论】:

      【解决方案2】:

      首先,使用您在 EnvironmentVariables 中使用的所有属性名称创建一个文件名 ApplicationSettings.cs,好吗?

      public class ApplicationSettings
      {
          public string DatabaseConnectionString { get; set; }
          public string valueXYZ { get; set; }
          public string CacheConnectionString { get; set; }
      } 
      

      之后,最好的方法是使用启动文件将这个配置加载到内存中(如果你的项目不存在这个,创建)

      [ExcludeFromCodeCoverage]
      public class Startup : FunctionsStartup
      {
          private IConfiguration _configuration = null;
      
          public override void Configure(IFunctionsHostBuilder builder)
          {
              var serviceProvider = builder.Services.BuildServiceProvider();
              _configuration = serviceProvider.GetRequiredService<IConfiguration>();
      
              SetupMaps
                  .ConfigureMaps();
      
              builder
                  .Services
                  .AddLogging();
      
              builder
                  .Services
                  .AddOptions<ApplicationSettings>() <-- YOUR CLASS
                  .Configure<IConfiguration>(
                  (settings, configuration) => { configuration.Bind(settings); });
          }
      

      === 现在在某些类中使用

      namespace YOUR_NAMESPACE
      {
          public class YOUR_CLASS: YOUR_INTERFACE
          {
          private readonly ApplicationSettings _applicationSettings;
      
          public YOUR_CLASS(
              IOptions<ApplicationSettings> applicationSettings)
          {
              _applicationSettings = applicationSettings.Value;
          }
      
          public async Task<RETURN_CLASS> METHOD_NAME(string PARAMETER)
          {
          //HERE YOU CAN USE _applicationSettings.PROP
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-17
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        • 2019-09-08
        • 1970-01-01
        • 2022-06-19
        • 2020-07-25
        相关资源
        最近更新 更多