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

ActivatorUtilities.CreateInstance创建的实例是否由DI容器自动释放?

关于ActivatorUtilities.CreateInstance的Disposable释放责任问题

核心结论

ActivatorUtilities.CreateInstance() 创建的实例不属于容器“解析的服务”范畴,无论目标类型是否已注册到DI容器,你都需要自行负责释放实现了 IDisposable 或 IAsyncDisposable 的实例。

详细解释

  1. 容器跟踪的范围
    .NET DI容器只会跟踪通过自身解析方法(如 Resolve<T>()、GetService<T>())创建的实例,这些实例的生命周期由容器管理,释放工作也由容器负责。而 ActivatorUtilities.CreateInstance() 只是借助容器解析目标类型的依赖参数,最终的实例是由该方法直接创建的,容器不会将其纳入生命周期跟踪体系。

  2. 已注册类型 vs 未注册类型的差异

    • 对于未注册的IDisposable类型:容器完全不知道该类型的存在,自然不会处理其释放,必须手动调用 Dispose()/DisposeAsync()。
    • 对于已注册的IDisposable类型:哪怕该类型在容器中有注册(比如瞬态、作用域或单例),用 ActivatorUtilities.CreateInstance() 创建的实例也不属于容器管理的实例池。容器只会释放它自己解析出来的那个实例,你通过该方法创建的实例仍需自行释放。

示例说明

// 假设MyDisposable已注册为瞬态服务
using var serviceProvider = new ServiceCollection()
    .AddTransient<MyDisposable>()
    .BuildServiceProvider();

// 情况1:容器解析的实例,由容器负责释放
var resolvedInstance = serviceProvider.GetService<MyDisposable>();
// 无需手动Dispose,容器会在自身释放时处理

// 情况2:ActivatorUtilities创建的实例,必须手动释放
var createdInstance = ActivatorUtilities.CreateInstance<MyDisposable>(serviceProvider);
// 必须手动调用Dispose
createdInstance.Dispose();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:08:12