我正在编写一个针对 dotnet 核心框架 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
当我不再需要它的实例时被删除。
由于以下几个原因,我转向了这个工具:
- 我只需要在短时间内建立数据库连接。
- 我插入了大量数据(不是在上面简化的示例/测试代码中),导致 DbContext 保持很大的缓存。我希望处理对象会释放内存,但现在我只会让它变得更糟:(
当我被调用Host.Services.GetService(typeof(MyHomeContext)) as MyHomeContext
的new MyHomeContext()
析构函数替换时。MyHomeContext
在我看来,依赖注入框架中的某些东西持有对该对象的引用。这是真的?如果是这样,我怎么能告诉它释放它?