Я пишу приложение, ориентированное на базовую структуру do tnet 3.1. Я использую внедрение зависимостей для настройки, среди прочего, контекста базы данных. В моем Program.cs у меня есть следующий код:
var host = new HostBuilder()
.ConfigureHostConfiguration(cfgHost =>
{
...
})
.ConfigureAppConfiguration((hostContext, configApp) =>
{
....
})
.ConfigureServices((hostContext, services) =>
{
...
services.AddDbContext<MyHomeContext>(options =>
{
options.UseNpgsql(hostContext.Configuration.GetConnectionString("DbContext"));
}, ServiceLifetime.Transient);
...
})
.ConfigureLogging((hostContext, logging) =>
{
...
})
.Build();
Я передаю host
другому классу. В этом другом классе у меня есть, как часть более длинного метода, следующий код:
using (var context = Host.Services.GetService(typeof(MyHomeContext)) as MyHomeContext)
{
StatusValues = context.Status.ToDictionary(kvp => kvp.Name, kvp => kvp.Id);
}
GC.Collect();
GC.Collect();
Вызовы GC.Collect
предназначены для тестирования / расследования. В MyHomeContext
I для целей тестирования реализован деструктор и переопределение Dispose (). Dispose () вызывается, но деструктор никогда не вызывается. Это приводит к утечке памяти для каждого экземпляра MyHomeContext
, который я создаю.
Чего мне не хватает? Что я могу сделать, чтобы убедиться, что экземпляр MyHomeContext
удаляется, когда он мне больше не нужен.
Я перешел на этот агрегат по нескольким причинам:
- I требуется только соединение с базой данных в течение короткого промежутка времени.
- Я вставляю много данных (не в приведенном выше сокращенном примере / тестовом коде), в результате чего DbContext сохраняет большой кэш. Я ожидал, что удаление объекта освободит память, но теперь я только усугубил это: (
Когда я заменяю Host.Services.GetService(typeof(MyHomeContext)) as MyHomeContext
на new MyHomeContext()
, вызывается деструктор MyHomeContext
. Кажется, мне, что что-то в структуре внедрения зависимостей содержит ссылку на объект. Это правда? Если так, как я могу сказать ему , чтобы освободить это?