Самый простой способ реализовать это - использовать два интерфейса, как показано в следующем примере:
interface IMyScopedInterface
{
void Foo();
}
interface IMyTransientInterface
{
void Foo();
}
class MyClass : IMyTransientInterface, IMyScopedInterface
{
public MyClass(MyDbContext dbContext)
{
}
public void Foo()
{
}
}
, а затем зарегистрировать свой класс с помощью следующего:
services.AddTransient<IMyTransientInterface, MyClass>();
services.AddScoped<IMyScopedInterface, MyClass>();
Вы не Для поддержки этого DbContext
не нужно делать ничего особенного. Давайте рассмотрим, как система DI разрешит эти службы, чтобы выяснить, может ли она объяснить, почему это так.
- Для начала система DI пытается получить экземпляр
IMyScopedInterface
(обычно потому, что Система DI пытается создать экземпляр какой-либо другой службы, конструктор которой принимает параметр IMyScopedInterface
. - Поскольку
IMyScopedInterface
был зарегистрирован с временем жизни с ограничениями, система DI сначала просматривает свою коллекцию служб, которые уже был создан экземпляр для текущей области, чтобы увидеть, создал ли он уже IMyScopedInterface
. Этот поиск происходит с пустыми руками, поэтому система DI затем переходит к созданию нового экземпляра MyClass
. - . Для этого он проверяет конструктор
MyClass
и определяет, что ему необходим * 1021. *, поэтому он возвращается через этот же поток для получения MyDbContext
. - Система DI создает экземпляр
MyClass
, предоставляющий полученный MyDbContext
, и затем кэширует этот MyClass
объект как часть текущей области, так что последующие запросы на IMyScopedInterface
в той же области могут получить общий объект.
Тот же самый поток c остается верным для IMyTransientInterface
за исключением того, что DI система не беспокоится о поиске ранее созданного экземпляра объекта, и после создания нового экземпляра MyClass
она вообще не кеширует его.
Надеемся, что из этого потока следует понять, что на самом деле не имеет значения, какова продолжительность жизни MyDbContext
. Если он зарегистрирован как временный, то каждый новый экземпляр MyClass
получит свой уникальный экземпляр MyDbContext
. Если срок действия MyDbContext
ограничен (что является поведением по умолчанию в Entity Framework), то все экземпляры MyClass
, созданные в данной области, будут использовать один экземпляр MyDbContext
независимо от того, были ли экземпляры MyClass
создается для IMyScopedInterface
или IMyTransientInterface
.