我在我的项目中使用 Unity。但是我不确定我是否应该使用 using
语句,因为我正在使用 PerRequestLifetimeManager
。
简单的例子:
注入(inject):
container.RegisterType<IDataContext, MyContext>(new PerRequestLifetimeManager());
用法:
class MyClass
{
private readonly IDataContext _context;
public MyClass(IDataContext context)
{
_context = context;
}
public string MyMethod()
{
// 1. Is this needed?
using (var u = _context)
{
var customers = u.Set<Customer>().OrderBy(o => o.Name);
// ........
}
// 2. OR can I just do this
var customers = _context.Set<Customer>().OrderBy(o => o.Name);
当我在我的注入(inject)中使用 PerRequestLifetimeManager()
时,这是否否定了 using
语句的要求,因为无论如何都会在每个 http 请求之后处理上下文?
最佳答案
如果您使用 using,那么您将立即处置 DbContext,如果您尝试再次访问它,则会导致异常,因此第一种方法通常不是一个好主意。 2 会工作但是如果 DbContext 中出现问题怎么办,例如您想要保留的新数据将不符合数据库设计(例如索引)。在这种情况下,您将无法重新创建 DbContext。我的建议是注册然后解析 DbContexts 的工厂方法:
class MyClass
{
private readonly Func<IDataContext> _contextFactory;
public MyClass(Func<IDataContext> contextFactory)
{
_contextFactory = contextFactory;
}
public string MyMethod()
{
// 1. Is this needed?
using (var u = _contextFactory())
{
var customers = u.Set<Customer>().OrderBy(o => o.Name);
// ........
}
}
关于c# - Unity,使用语句和 PerRequestLifetimeManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24009032/