Xai*_*oft 3 c# datacontext entity-framework .net-3.5 asp.net-mvc-3
我不太清楚如何正确的方法Dispose
我ObjectContext
是.这是我的设置方式:
public abstract class DataManagerBase<T> where T:ObjectContext
{
protected T _context = null;
public string Message { get; set; }
public DataManagerBase(T context)
{
_context = context;
}
}
Run Code Online (Sandbox Code Playgroud)
要在其他类中使用它,我做的事情如下:
public class Test : DataManagerBase<DataEntities>
{
public Test(DataEntities context)
: base(context){}
public void InsertRecord(Person p)
{
if(_context != null)
{
try
{
//Do insert logic
}
catch(Exception ex)
{
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有其他方法使用相同的_context
,所以我没有使用using
语句,所以_context
如果抛出异常然后处置它,我应该检查是否为空?基本上我想确保_context在我完成时被处理,无论是否有异常.将添加finally
到每一个try/catch
是不正确的?
将此方法添加到我的DataManagerBase类,然后在其他类中调用它可以做到这一点:
public void DisposeContext()
{
if (_context != null)
{
_context.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
拇指的规则是:不要处理你没有创建的对象.因此,您不应将您的上下文置于您提供的任何类中.
但是context.Dispose()
,您应该在课堂上调用,实际创建此特定实例.当你这样做时 - 应该没有其他对象使用它.你要做的是避免设计问题,而不是修复它.这是错的,imho.当你忘记在某个地方再次进行无效检查时,这会在某些时候咬你.
使用您提供的代码示例可能如下所示:
void SomeMethodInOuterScope()
{
var context = new DataEntities();
var test = new Test(context);
try
{
test.InsertRecord(new Person());
...............
}
catch(Exception ex)
{
....
}
finally
{
context.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
这是另一个例子(当上下文不是本地的时)
class SomeClassInOuterScope : IDisposable
{
private DataEntities _context;
public SomeClassInOuterScope()
{
_context = new DataEntities();
}
public void Test()
{
var test = new Test(_context);
test.InsertRecord(new Person());
...............
}
public void Dispose()
{
_context.Dispose();
}
}
void SomeMethodInOuterOuterScope()
{
var someclass = new SomeClassInOuterScope();
try
{
someclass.Test();
...............
}
catch(Exception ex)
{
....
}
finally
{
someclass.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2010 次 |
最近记录: |