簡體   English   中英

來自 DI 容器.Net Core 的實現工廠方法中的對象

[英]Are objects from an implementation factory method disposed by the DI container .Net Core

當我使用顯式 implementationFactory 注冊接口的實現時,如下所示:

services.AddTransient<IDbConnection>(_ => new SqlConnection(connectionString));

該實現在請求時被初始化,並在 DI 容器超出 scope 時被釋放。

但是當我執行以下操作時,DI 容器是否也會處理 SqlConnection:

services.AddTransient<IRepository>(_ => new Repository(new SqlConnection(connectionString)));

智能感知並沒有警告我關於實現 IDisposable 的未處理的 object,但我認為這是不對的。

不,容器不會在第二種情況下處理,因為它對這個手動創建的實例一無所知:

class MyDisposable : IDisposable
{
    public bool Disposed { get; private set; }
    public void Dispose()
    {
        Disposed = true;
    }
}

class Container
{
    public Container(MyDisposable d)
    {
        Disposable = d;
    }
    public MyDisposable Disposable { get; private set; }
}

var col = new ServiceCollection();
col.AddTransient<MyDisposable>(_ => new MyDisposable());
col.AddTransient<Container>(s => new Container(new MyDisposable()));

Container container;
MyDisposable disposable;
using(var scope = col.BuildServiceProvider().CreateScope())
{
    container = scope.ServiceProvider.GetRequiredService<Container>();
    disposable = scope.ServiceProvider.GetRequiredService<MyDisposable>();
}
Console.WriteLine(disposable.Disposed); // true
Console.WriteLine(container.Disposable.Disposed); // false

但是,如果您將第二次注冊更改為:

col.AddTransient<Container>(s => new Container(s.GetRequiredService<MyDisposable>()));

兩個MyDisposable都將被處置。

例如,使用[Autofac][1]可以解析當前生命周期 scope 並安排手動創建的實例以在此 scope 結束時進行處理:

var builder = new ContainerBuilder();
builder.Register(_ => new MyDisposable()).InstancePerDependency();
builder.Register(ctx => 
{
    var scope = ctx.Resolve<ILifetimeScope>();
    var dep = new MyDisposable();
    scope.Disposer.AddInstanceForDisposal(dep);
    return new Container(dep);
})
.InstancePerDependency();

Container container;
MyDisposable disposable;
using(var scope = builder.Build().BeginLifetimeScope())
{
    container = scope.Resolve<Container>();
    disposable = scope.Resolve<MyDisposable>();
}

Console.WriteLine(disposable.Disposed); // true
Console.WriteLine(container.Disposable.Disposed);  // true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM