如何使用Options模式绑定appsettings.json的JSON字符串并注入对象集合
实现步骤
你可以通过「先读取配置节点的JSON字符串、反序列化后手动注册Options服务」的方式实现需求,不需要修改现有配置存储格式和实体类定义。
核心配置代码
在Startup.cs的ConfigureServices方法中添加如下代码:
using Microsoft.Extensions.Options; using System.Text.Json; public void ConfigureServices(IServiceCollection services) { // 项目中已有的其他服务注册逻辑,比如AddControllers()等 // services.AddControllers(); // 1. 绑定原有的MappingCode配置节点,其他地方需要用到该配置时可保留,不需要可以跳过这步 services.Configure<MappingCode>(Configuration.GetSection("MappingCodes")); // 2. 读取存储的转义JSON字符串,反序列化为Product集合 var systemOneJsonStr = Configuration.GetValue<string>("MappingCodes:SystemOne"); var products = JsonSerializer.Deserialize<List<Product>>( systemOneJsonStr, new JsonSerializerOptions { PropertyNameCaseInsensitive = true } ) ?? new List<Product>(); // 3. 注册IOptions<IList<Product>>服务实例 services.AddSingleton<IOptions<IList<Product>>>(Options.Create<IList<Product>>(products)); }
补充说明
- 如果你项目中使用Newtonsoft.Json做序列化,只需要把反序列化的代码替换为
JsonConvert.DeserializeObject<List<Product>>(systemOneJsonStr) ?? new List<Product>()即可,记得引入Newtonsoft.Json命名空间。 - 如果你需要配置热更新(修改appsettings.json后无需重启应用自动刷新配置值),建议注入
IOptionsMonitor<IList<Product>>替代IOptions<IList<Product>>,注册时配置变更监听逻辑即可,默认的IOptions是单例注册不会感知配置变更。 - 注册完成后即可完全按照你给出的示例代码,直接在类构造函数中注入
IOptions<IList<Product>>使用,Value属性就是反序列化完成的Product集合。
内容的提问来源于stack exchange,提问作者O'Neil Tomlinson
相关产品推荐
相关产品推荐

