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

如何阻止Microsoft ServiceCollection释放特定注册服务?

Microsoft ServiceCollection 对外部拥有服务的支持

在Microsoft ServiceCollection中,确实支持标记服务为外部拥有,让DI容器在释放作用域或容器本身时不自动释放该服务,对应Autofac里的ExternallyOwned()功能。

具体实现分两种常见场景:

1. 注册已实例化的外部对象

如果你已经预先创建好实例,想要将其注入到DI容器但不让容器管理生命周期,直接使用AddSingleton<T>(T instance)即可——容器默认不会释放这个外部实例:

var externalComponent = new SomeComponent();
services.AddSingleton<ISomeComponent>(externalComponent);

2. 注册类型并控制所有权

如果是注册类型而非现成实例,需要通过自定义工厂逻辑来确保容器不接管实例的释放。常用方式是结合AddSingleton和工厂委托:

services.AddSingleton<ISomeComponent>(serviceProvider =>
{
    // 在这里创建或获取外部实例,容器不会主动释放它
    return new SomeComponent();
});

注意事项

  • 对于Scoped或Transient生命周期的服务,容器默认会管理实例的释放逻辑,无法直接通过常规API标记为外部拥有。如果必须用这类生命周期,建议手动控制实例的创建与销毁,仅通过DI容器提供访问入口;或者将实例注册为Singleton,再根据作用域需求做封装。
  • 若需更复杂的生命周期控制,可自定义IServiceProvider或扩展,但这种方式仅适合特殊场景,不推荐常规使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:33:10