Castle Windsor的DictionaryAdapterFactory在IHostBuilder中的等价实现是什么
基于IHostBuilder实现IApplicationConfiguration配置注入的实操步骤
- 第一步:适配配置源
你可以选择保留原有的app.config,或者迁移到.NET 5更推荐的appsettings.json格式:- 保留app.config的话,需要额外添加XML配置源加载逻辑,同时把项目里的app.config文件属性设置为「如果较新则复制」到输出目录
- 迁移到appsettings.json的话不需要额外配置,
Host.CreateDefaultBuilder默认会自动加载appsettings.json以及对应环境的配置文件
- 第二步:绑定配置到实体
你现有的IApplicationConfiguration接口对应的实现类,属性名和配置项的键名保持一致(大小写不敏感),就可以直接用Bind方法完成配置值到实体的自动映射,不需要手动读取每个配置项 - 第三步:注册到DI容器
将绑定完成的配置实例以单例模式注册到微软内置DI容器中,业务层构造函数注入IApplicationConfiguration的用法和之前Castle.Windsor的用法完全一致,不需要修改业务代码
完整代码示例
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Configuration; namespace YourAppNamespace { class Program { static void Main(string[] args) { var host = Host.CreateDefaultBuilder(args) // 保留app.config的情况下添加这部分配置,用appsettings.json可以删除这段 .ConfigureAppConfiguration((context, config) => { config.AddXmlFile("app.config", optional: false, reloadOnChange: true); }) .ConfigureServices((context, services) => { // 绑定配置到实现类实例 var appConfig = new ApplicationConfiguration(); // 如果配置都在某个节点下,可以用GetSection指定节点,比如context.Configuration.GetSection("AppSettings").Bind(appConfig) context.Configuration.Bind(appConfig); // 注册接口和实例到DI容器 services.AddSingleton<IApplicationConfiguration>(appConfig); // 你其他的业务服务注册都可以写在这里,对应Castle.Windsor的注册逻辑替换即可 // services.AddTransient<IBusinessService, BusinessService>(); }) .Build(); // 启动你的应用逻辑 // var app = host.Services.GetRequiredService<IYourAppEntry>(); // app.Run(); host.Run(); } } // 你已有的接口和实现类示例 public interface IApplicationConfiguration { string DbConnectionString { get; } int MaxRetryCount { get; } } public class ApplicationConfiguration : IApplicationConfiguration { public string DbConnectionString { get; set; } public int MaxRetryCount { get; set; } } }
补充说明
- 如果用传统app.config的
<appSettings>节点存储配置,<add>标签的key要和实现类的属性名完全对应,例如<add key="MaxRetryCount" value="3" />就可以自动绑定到MaxRetryCount属性 - 把配置加载的
reloadOnChange参数设为true可以实现配置热更新,不需要重启应用就能拿到最新配置值 - 原Castle.Windsor的服务注册逻辑都可以迁移到
ConfigureServices方法中,用微软DI的AddSingleton/AddScoped/AddTransient方法对应原来的生命周期即可
内容的提问来源于stack exchange,提问作者Antonio Costa
相关产品推荐
相关产品推荐

