如何在 ASP.NET 核心中使用 DI 处理辅助一次性用品?

How to dipose helper disposables using DI in ASP.NET core?

对于常规情况如何管理 post 等一次性用品, 解释了如何操作。

但我的情况略有不同——我没有像这里这样的某个工人 IFoo 的单个实例:

interface IFoo : IDisposable // not my case

您知道如何处理,只需在 IFoo.

的实例上调用 Dispose

不,我的 IFoo 不是 IDisposable:

interface IFoo // my case

我创建了一对实例而不是单个实例 -- (IFoo,IDisposable)。当我必须做真正的工作时,我会使用第一项,因为那里有所有逻辑,当我完成后,我会在第二项上调用 Dispose

可以说是极端的脱钩

当我在 ASP.NET Core 时,我遇到了 DI 问题——我有一对像上面那样,我可以注册 IFoo,例如 services.AddScoped,但是如何告诉 services 手边有 distinct/separate IDisposable,当工作完成并且作用域消失时应该将其处理掉?

您可以围绕 (IFoo, IDisposable) 创建一个包装器,比方说:

public class DisposableFoo : IDisposable
{
    // Assume FooConcrete implements IFoo and IDisposable
    private readonly FooConcrete _foo;

    public DisposableFoo(FooConcrete fooConcrete) { _foo = fooConcrete; }

    public IFoo Instance => _foo;

    public void Dispose() => _foo.Dispose();
}

然后在 Startup.cs 中,您可以执行以下操作以保持抽象清晰:

services.AddTransient<FooConcrete>();
services.AddScoped<DisposableFoo>();
services.AddScoped<IFoo>(ctx => ctx.Resolve<DisposableFoo>.Instance); 

在这种情况下,底层 FooConrecte 将在作用域生命周期结束时正确处理。