我想在不使用存储库的情况下直接在业务/服务层使用EF,但是如果我想使用测试数据库使类可测试,那么想知道创建/处理上下文的最佳位置在哪里?
它是否应该在服务构造函数中使用DI并将该类标记为IDisposable并在那里删除它或者只是将每个调用包装在using块中?
答案 0 :(得分:1)
我不确定您对存储库类的不情愿,但这是我一直在为我的服务层创建一个销毁EF上下文的地方。
因此,对于我的MVC Web应用程序,我使用带有lifetimescope的Autofac注册存储库
builder
.RegisterType<AccountRepository>()
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
我的帐户服务将从容器中获取对存储库实例的引用,并且可以在Web请求的整个生命周期内访问单个上下文。请求完成后,Autofac将调用存储库上的dispose并清理上下文。
public sealed class AccountRepository : IAccountRepository, IDisposable
{
private AccountContext _context = new AccountContext();
public IList<AccountEntity> GetAccounts()
{
return _context.Accounts
.OrderBy(x => x.Name)
.ToList();
}
public void Dispose()
{
_context.Dispose();
_context = null;
}
}