C# 如何使ServiceProvider对手动创建的对象调用Dispose?

C# 如何使ServiceProvider对手动创建的对象调用Dispose?,c#,.net,dependency-injection,.net-core,C#,.net,Dependency Injection,.net Core,我正在使用Microsoft.Extensions.DependencyInjection(默认实现)。我注意到,当我将对象添加为singleton时,ServiceProvider会忽略对象上的IDisposable var instance = new MyDisposableObj(); ServiceLocator.Instance = instance; var services = new ServiceCollection(); services.AddSingleton( in

我正在使用Microsoft.Extensions.DependencyInjection(默认实现)。我注意到,当我将对象添加为singleton时,
ServiceProvider
会忽略对象上的
IDisposable

var instance = new MyDisposableObj();
ServiceLocator.Instance = instance;

var services = new ServiceCollection();
services.AddSingleton( instance );
var container = services.BuildServiceProvider();
container.Dispose();
看起来microsoft认为我必须手动处理手动创建的对象

但是,在为ServiceCollection执行扩展时,我希望封装对对象的处理。我不应该强迫扩展的用户手动处理我的对象


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

我知道这很旧,但也许这有助于澄清一点。
您可以自己创建对象并使用实现工厂进行注册。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();
}
[事实]
public void ServiceProvider_SingletonObjectAddedAsFactory_IsDisposedWithContainer()
{
//安排
var sc=新服务集合();
var fake=A.fake();
sc.AddSingleton(x=>false);
//表演
var sp=sc.BuildServiceProvider();
var received=sp.GetService();
sp.Dispose();
//断言
已收到。应()。未收到();
A.CallTo(()=>false.Dispose()).MustHaveHappenedOnceExactly();
}

更改什么行为?您希望什么时候处置对象?处置其他人的单例将是一件好事:)。。。通常情况下,如果它是真正的单例,那么不重新启动应用程序就不可能将其恢复到“未处置状态”——因此我不确定在这种情况下,为什么您希望容器拥有所有权(特别是如果您可以创建多个容器),顺便说一句,“看起来microsoft认为我必须手动处置手动创建的对象”一次性对象应始终由拥有(最后一次)所有权的代码处理(不受规则限制的例外情况)。我在这里感觉到了对伊迪斯波塞布斯的根本误解吗?@Alexei Levenkov这是我的目标。我创建它并将其添加到ServiceCollection。我是否应该手动创建
ServiceDescriptor