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
блок вызывает правильную утилизацию объекта.