依赖注入是否会自动处置注册代码中的BlobContainerClient对象?
问题解答
首先直接给结论:你手动创建的BlobContainerClient不会被ASP.NET Core的DI容器自动处置,原因如下:
- ASP.NET Core DI仅会自动处置那些由容器自身创建并纳入生命周期管理的对象。你这里是直接通过
new BlobContainerClient(...)手动实例化的对象,DI容器完全不知道它的存在,自然不会负责其销毁与资源释放。 - 至于它是否会被间接处置,完全取决于
EventProcessorClient的内部实现:如果EventProcessorClient的Dispose方法中会调用传入的BlobContainerClient的Dispose,那它会随EventProcessorClient的销毁被间接释放;但如果EventProcessorClient没有做这个逻辑,这个BlobContainerClient就会成为潜在的资源泄漏点。
推荐的修正做法
既然BlobContainerClient是线程安全的(Azure SDK官方明确说明),更合理的方式是把它注册为Singleton生命周期的服务,再由DI注入给EventProcessorClient,示例代码如下:
// 先注册BlobContainerClient为Singleton services.TryAddSingleton<BlobContainerClient>(_ => new BlobContainerClient("connectionString", "containerName")); // 再注册EventProcessorClient,让DI注入BlobContainerClient services.TryAddScoped<EventProcessorClient>(p => { var storageClient = p.GetRequiredService<BlobContainerClient>(); var connectionParam = p.GetRequiredService<IOptions<EventHubSettings>>(); return new EventProcessorClient(storageClient, connectionParam.Value.SomeValue, connectionParam.Value.SomeValue); });
这样既符合DI的生命周期管理规范,也能确保BlobContainerClient被正确处置,同时还能复用单实例提升性能。
内容的提问来源于stack exchange,提问作者akshay_zz
相关产品推荐
相关产品推荐

