如何使ServiceProvider在手动创建的对象上调用Dispose?

时间:2019-02-24 23:52:13

标签: c# .net dependency-injection .net-core

我正在使用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进行扩展的情况下,我想封装对象的处置。我不应该强迫扩展程序的用户手动处理我的对象!

那么,有可能改变这种行为吗?

1 个答案:

答案 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();
}