ActivatorUtilities.CreateInstance创建的实例是否由DI容器自动释放?
关于ActivatorUtilities.CreateInstance的Disposable释放责任问题
核心结论
ActivatorUtilities.CreateInstance() 创建的实例不属于容器“解析的服务”范畴,无论目标类型是否已注册到DI容器,你都需要自行负责释放实现了 IDisposable 或 IAsyncDisposable 的实例。
详细解释
容器跟踪的范围
.NET DI容器只会跟踪通过自身解析方法(如Resolve<T>()、GetService<T>())创建的实例,这些实例的生命周期由容器管理,释放工作也由容器负责。而ActivatorUtilities.CreateInstance()只是借助容器解析目标类型的依赖参数,最终的实例是由该方法直接创建的,容器不会将其纳入生命周期跟踪体系。已注册类型 vs 未注册类型的差异
- 对于未注册的IDisposable类型:容器完全不知道该类型的存在,自然不会处理其释放,必须手动调用
Dispose()/DisposeAsync()。 - 对于已注册的IDisposable类型:哪怕该类型在容器中有注册(比如瞬态、作用域或单例),用
ActivatorUtilities.CreateInstance()创建的实例也不属于容器管理的实例池。容器只会释放它自己解析出来的那个实例,你通过该方法创建的实例仍需自行释放。
- 对于未注册的IDisposable类型:容器完全不知道该类型的存在,自然不会处理其释放,必须手动调用
示例说明
// 假设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
相关产品推荐
相关产品推荐

