如何在 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
将在作用域生命周期结束时正确处理。
对于常规情况如何管理 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
将在作用域生命周期结束时正确处理。