我创建了简单的工厂来创建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()方法并调用它。有人遇到过这样的问题吗?
答案 0 :(得分:0)
答案是在注册DbContext时使用.ExternallyOwned()扩展方法:
builder
.RegisterType<DbContext>()
.AsImplementedInterfaces()
.ExternallyOwned()
然后将其包装在using
块中会导致对象的正确处理。