Как дозировать вспомогательные расходные материалы, используя DI в ядре ASP. NET? - PullRequest
0 голосов
/ 25 февраля 2020

Для обычного случая, как управлять одноразовыми материалами, например Как правильно и безопасно утилизировать экземпляры синглетонов, зарегистрированные в контейнере, когда ASP. NET Основное приложение выключается объясняет, как это сделать .

Но у меня немного другой случай - у меня нет ни одного экземпляра какого-то работника IFoo, как здесь:

interface IFoo : IDisposable // not my case

, который вы знаете, как распоряжаться, просто позвоните Dispose на экземпляре IFoo.

Нет, мой IFoo равен , а не IDisposable:

interface IFoo // my case

вместо одного экземпляра, я есть пара экземпляров при создании - (IFoo,IDisposable). Когда мне приходится выполнять настоящую работу, я использую первый элемент, потому что там есть все логи c, когда я закончу, я вызываю Dispose для второго элемента.

Можно сказать, что это развязка ставится на крайние значения.

И когда я нахожусь на ASP. NET Core, у меня проблемы с DI - у меня есть пара, подобная выше, я могу зарегистрировать IFoo с, например, services.AddScoped , но как сказать services, что под рукой есть отдельное / отдельное IDisposable, которое следует утилизировать, когда работа завершена и область действия исчезла?

1 Ответ

3 голосов
/ 25 февраля 2020

Вы можете создать оболочку вокруг (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 будет правильно расположен в конце срока действия области действия.

...