Autofac - 内存泄漏

时间:2016-10-06 17:30:46

标签: c# entity-framework memory-leaks singleton autofac

我创建了简单的工厂来创建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注入我的工厂,并在每次调用CreateContext()时创建。

在bootstrapper中注册是:

builder
            .RegisterType<ContextFactory>()
            .As<IContextFactory>()
            .SingleInstance();

所以工厂是单身和上下文注册:

builder
            .RegisterType<OdynDbContext>()
            .AsImplementedInterfaces()
            .InstancePerDependency();

是每个依赖项的实例。

我在using()块中使用了创建的上下文,所以每次都要处理它:

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()方法并调用它。有人遇到过这样的问题吗?

1 个答案:

答案 0 :(得分:0)

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

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

然后将其包装在using块中会导致对象的正确处理。