如何在ASP.NET中实现配置类继承且避免JSON配置重复?
如何在.NET配置中让子类OptionsChild继承基类OptionsBase的配置(不重复JSON内容)
问题背景
我有多个配置结构相似的类,希望通过创建包含通用配置的基类OptionsBase,让子类OptionsChild继承它,最终在逻辑类Child1中使用。现有代码如下:
基类与子类定义:
public class OptionsBase { public string ConnectionKey { get; set; } } public class OptionsChild: OptionsBase { public string ChildName{ get; set; } }
JSON配置文件:
"OptionsBase": { "ConnectionKey": "basekey" }, "OptionsChild": { "ChildName": "child1" }
期望在逻辑类中直接通过子类实例访问基类配置属性:
public class Child1 { private readonly OptionsChild _options; public Child1(IOptions<OptionsChild> options) { _options = options.Value; } public void Example() { var valueFromParent = _options.ConnectionKey; // 期望拿到"basekey" } }
当前配置初始化代码仅绑定了子类配置节:
service.Configure<OptionsChild>(config.GetSection("OptionsChild"));
需求:在不重复JSON配置内容、不新增额外通用配置类的前提下,实现子类实例同时获取基类与子类的配置属性。
可行解决方案
修改配置初始化代码,通过两次Bind操作合并基类与子类的配置节内容:
service.Configure<OptionsChild>(options => { // 先绑定基类配置节的内容到OptionsChild实例 config.GetSection("OptionsBase").Bind(options); // 再绑定子类配置节的内容,补充子类独有的属性 config.GetSection("OptionsChild").Bind(options); });
原理说明
.NET配置系统的Bind方法会根据属性名称递归匹配并赋值。由于OptionsChild继承自OptionsBase,第一次绑定OptionsBase节时,会自动填充ConnectionKey属性;第二次绑定OptionsChild节时,会填充子类独有的ChildName属性,最终实现配置的合并,无需重复编写JSON内容。
这样修改后,Child1中的_options.ConnectionKey就能正确获取到basekey,_options.ChildName获取到child1,完全符合需求。
内容的提问来源于stack exchange,提问作者obgire
相关产品推荐
相关产品推荐

