You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET中单独注册服务?能否在CreateHostBuilder.Build()后调用AddServices?

核心结论

  1. Build执行完成后不能再注册服务
    调用CreateHostBuilder().Build()后,依赖注入容器已经完成初始化生成了只读的IServiceProvider,默认.NET自带的DI容器不支持后续再调用AddServices这类服务注册方法,强制修改会直接抛出异常。
  2. 可以在CreateHostBuilder外部注册服务,只要操作发生在Build调用之前
    IHostBuilder的服务注册逻辑本质是收集配置信息,只要还没执行Build,不管在方法内部还是外部修改IHostBuilder的配置都是有效的。

正确实现示例

你可以按如下方式在CreateHostBuilder外追加服务注册:

public App()
{
    // 先获取IHostBuilder实例
    var hostBuilder = CreateHostBuilder();
    
    // 外部追加注册服务,两种方式都可以
    // 方式1:调用你自定义的AddServices扩展方法
    hostBuilder.AddServices();
    // 方式2:直接用原生ConfigureServices注册
    hostBuilder.ConfigureServices(services =>
    {
        services.AddSingleton<IYourCustomService, YourCustomServiceImpl>();
    });
    
    // 所有注册完成后再执行Build
    m_host = hostBuilder.Build();       
}    

public static IHostBuilder CreateHostBuilder(string[] args = null)
{
    return Host.CreateDefaultBuilder(args)
                    .AddManager()
                    .AddStores()
                    .AddViewModels()
                    .AddViews();
}

特殊场景说明

如果确实有运行时动态注册服务的需求,默认的.NET DI容器不支持该操作,你可以替换为支持动态修改容器的第三方DI组件(比如Autofac),但这类方案会引入额外复杂度,非必要不推荐使用。

内容的提问来源于stack exchange,提问作者S4amon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:15:03