代码之家  ›  专栏  ›  技术社区  ›  SteinTech

无法从ASP中的应用程序设置加载选项。NET Core站点使用IOptions

  •  0
  • SteinTech  · 技术社区  · 4 月前

    我正试图从ASP中的appsettings文件加载数据。NET核心项目。我以前做过,但现在我做不到。 此外,我试图配置一个名为Images的部分,并将其绑定到WorkImageOptions类型的对象,该对象包含有关图像集合的信息。

    我尝试使用IOptionsSnapshot检索值,但如果设置部分有数据,则始终为空。

    程序cs :

    using SLT.Bohem63.Peachie.Config;
    
    WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
    builder.Services
        .Configure<WorkImageOptions>(builder.Configuration.GetSection(WorkImageOptions.SectionName));
    
    builder.Services.AddControllersWithViews();
    
    WebApplication app = builder.Build();
    
    app.UseRouting();
    app.MapStaticAssets();
    
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Bohem63}/{action=Index}/{id?}")
        .WithStaticAssets();
    
    app.Run();
    

    WorkImageOptions.cs :

    public sealed class WorkImageOptions
    {
        public IEnumerable<WorkImageInfo> Images { get; set; }
    
        public static string SectionName => "Images";
    }
    

    WorkImageInfo.cs :

    namespace SLT.Bohem63.Peachie.Models.Data
    {
        public interface IWorkImageInfo
        {
            string Filename { get; set; }
            string Title { get; set; }
            string Description { get; set; }
            int Likes { get; set; }
        }
    
        public sealed class WorkImageInfo : IWorkImageInfo
        {
            public string Filename { get; set; }
            public string Title { get; set; }
            public string Description { get; set; }
            public int Likes { get; set; } = 0;
        }
    }
    

    检索选项 :

    public class Bohem63Controller(IOptionsSnapshot<WorkImageOptions> options) : Controller { }
    

    应用程序参数 :

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*",
      "Images": {
        "filename": "pic1.jpg",
        "title": "",
        "description": "",
        "likes": 0
      }
    }
    
    1 回复  |  直到 4 月前
        1
  •  1
  •   Ivan Petrov    4 月前

    在当前的结构下,apps.json必须看起来像这样才能工作:

    "Images": {
      "Images": [
        {
          "filename": "foo.jpg",
          "title": "bar",
          "description": "baz",
          "likes": 42
        }
      ]
    }
    

    虽然我会通过摆脱 SectionName 财产和使用 nameof 改为类名:

    builder.Services
        .Configure<WorkImageOptions>(builder.Configuration.GetSection(nameof(WorkImageOptions)));
    

    应用设置:

    "WorkImageOptions": {
      "Images": [
        {
          "filename": "foo.jpg",
          "title": "bar",
          "description": "baz",
          "likes": 42
        }
      ]
    }