You need to enable JavaScript to run this app. Castle Windsor的DictionaryAdapterFactory在IHostBuilder中的等价实现是什么
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 09:15:03