我正在使用Microsoft.Extensions.DependencyInjection
(默认实现)。我注意到当我将对象添加为单例时,ServiceProvider
会忽略对象上的IDisposable
。
var instance = new MyDisposableObj();
ServiceLocator.Instance = instance;
var services = new ServiceCollection();
services.AddSingleton( instance );
var container = services.BuildServiceProvider();
container.Dispose();
看起来像Microsoft,我必须手动处理手动创建的对象。
但是在我为ServiceCollection进行扩展的情况下,我想封装对象的处置。我不应该强迫扩展程序的用户手动处理我的对象!
那么,有可能改变这种行为吗?
答案 0 :(得分:2)
我知道这是旧的,但也许它会有助于澄清一点。
您可以自己创建对象并使用实现工厂进行注册。 DI 将负责处理对象,因为它通过调用工厂方法来获取对象的所有权。
它在 msdn 中有描述。
var instance = new MyDisposableObj();
var services = new ServiceCollection();
services.AddSingleton(x => instance);
var container = services.BuildServiceProvider();
container.Dispose();
您可以通过简单的单元测试来验证这一点
[Fact]
public void ServiceProvider_SingletonObjectAddedAsFactory_IsDisposedWithContainer()
{
// Arrange
var sc = new ServiceCollection();
var fake = A.Fake<IDisposable>();
sc.AddSingleton(x => fake);
// Act
var sp = sc.BuildServiceProvider();
var recieved = sp.GetService<IDisposable>();
sp.Dispose();
// Assert
recieved.Should().NotBeNull();
A.CallTo(() => fake.Dispose()).MustHaveHappenedOnceExactly();
}