Autofac - утечка памяти

Я создал простую фабрику для создания DbContext Entity Framework. Это реализовано так (упрощенный код):

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();

это экземпляр на зависимость.

Я использую созданный контекст при использовании блока (), поэтому он должен быть расположен каждый раз:

public TestClass
{
    private readonly IContextFactory _contextFactory;
    public TestClass(IContextFactory contextFactory)
    {
        _contextFactory = contextFactory;
    }

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

И, к сожалению, контекст неправильно настроен. Он остается где-то в памяти и вызывает утечку. Я не знаю почему. Я переопределил метод Dispose() в DbContext, и он вызывается. Кто-нибудь сталкивался с такой проблемой?

0 ответов

Ответ - использовать метод расширения.ExternalOwned() при регистрации DbContext:

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

Затем завернув его в using блок вызывает правильную утилизацию объекта.

Другие вопросы по тегам