如何在.NET中单独注册服务?能否在CreateHostBuilder.Build()后调用AddServices?
核心结论
- Build执行完成后不能再注册服务
调用CreateHostBuilder().Build()后,依赖注入容器已经完成初始化生成了只读的IServiceProvider,默认.NET自带的DI容器不支持后续再调用AddServices这类服务注册方法,强制修改会直接抛出异常。 - 可以在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
相关产品推荐
相关产品推荐

