В приложении. NET Core Console я хочу использовать встроенную инъекцию зависимостей, включая автоматическое c удаление IDisposable
объектов в цепочке. В ASP. NET Core объекты создаются и располагаются с каждым запросом, что представляется разумным.
Но в консольном приложении мне нужно создать поставщика услуг, а затем запустить его, получив первый элемент в цепочке от провайдера и работает:
class Program {
static void Main() {
using var serviceProvider = new ServiceCollection()
.AddTransient<Program>()
.AddTransient<Repository>()
.AddTransient<MyContext>()
.BuildServiceProvider();
serviceProvider.GetService<Program>().Go();
}
private readonly Repository _repo;
public Program(Repository repo) => _repo = repo;
public void Go() => _repo.Go();
}
public class Repository : IDisposable {
private readonly MyContext _context;
public Repository(MyContext context) => _context = context;
public void Go() => Console.WriteLine("Go!");
public void Dispose() => Console.WriteLine("Repository Disposed!");
}
public class MyContext : DbContext {
public override void Dispose() {
base.Dispose();
Console.WriteLine("MyContext Disposed!");
}
}
Когда утилизируется serviceProvider
, остальные располагаются также:
Go!
Repository Disposed!
MyContext Disposed!
Если я хочу запустить в процессе oop или с таймером ничего не удаляется до тех пор, пока не будет удален сам поставщик услуг:
for (int i = 0; i < 3; ++i)
{
serviceProvider.GetService<Program>().Go();
}
Go!
Go!
Go!
Repository Disposed!
MyContext Disposed!
Repository Disposed!
MyContext Disposed!
Repository Disposed!
MyContext Disposed!
Если я располагаю и воссоздаю поставщика услуг каждый раз, я получаю требуемые результаты:
for (int i = 0; i < 3; ++i)
{
using var serviceProvider = new ServiceCollection()
.AddTransient<Program>()
.AddTransient<Repository>()
.AddTransient<MyContext>()
.BuildServiceProvider();
serviceProvider.GetService<Program>().Go();
}
Go!
Repository Disposed!
MyContext Disposed!
Go!
Repository Disposed!
MyContext Disposed!
Go!
Repository Disposed!
MyContext Disposed!
Мой вопрос: можно ли продолжать строить и утилизировать поставщика снова и снова, как это? Я думаю делать это по таймеру каждые несколько секунд до бесконечности. Это дорогостоящий процесс, и есть ли лучший способ, без необходимости вручную размещать объекты по всей цепочке?
Или это может быть то, что ASP. NET Ядро делает позади в любом случае, воссоздавая провайдера с каждым запросом?