gpt4 book ai didi

c# - Autofac - 内存泄漏

转载 作者:行者123 更新时间:2023-12-03 21:33:28 24 4
gpt4 key购买 nike

我创建了简单的工厂来创建 Entity Framework 的 DbContext。它是这样实现的(简化代码):

public class ContextFactory : IContextFactory
{
private Func<IDbContext> _dbContext;

public ContextFactory(Func<IDbContext> dbContext)
{
_dbContext = dbContext;
}

public IDbContext CreateContext()
{
var context = _dbContext();
context.Configuration.ProxyCreationEnabled = false;

return context;
}
}

如您所见,DbContext 作为 Func 注入(inject)我的工厂,并在每次调用 CreateContext() 时创建。

在 Bootstrap 中的注册是:
builder
.RegisterType<ContextFactory>()
.As<IContextFactory>()
.SingleInstance();

所以工厂是单例和上下文注册:
builder
.RegisterType<OdynDbContext>()
.AsImplementedInterfaces()
.InstancePerDependency();

是每个依赖项的实例。

我在 using() block 中使用创建的上下文,因此每次都应该处理它:
public TestClass
{
private readonly IContextFactory _contextFactory;
public TestClass(IContextFactory contextFactory)
{
_contextFactory = contextFactory;
}

public void TestMethod()
{
using(var context = _contextFactory.CreateContext())
{
... operations on context
}
}

不幸的是,上下文没有正确处理。它停留在内存中的某个地方并导致泄漏。我不知道为什么。我在 DbContext 中重写了 Dispose() 方法并调用了它。有人遇到过这样的问题吗?

最佳答案

答案是在注册 DbContext 时使用 .ExternallyOwned() 扩展方法:

builder
.RegisterType<DbContext>()
.AsImplementedInterfaces()
.ExternallyOwned()

然后将其包裹在 using block 导致正确处置对象。

关于c# - Autofac - 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39902271/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com