gpt4 book ai didi

c# - 处理我的 ObjectContext 的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-30 13:58:22 26 4
gpt4 key购买 nike

我不太确定 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;
}
}

要在其他类(class)中使用它,我正在做类似的事情:

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)
{

}
}
}

}

我有其他方法使用相同的 _context,所以我没有使用 using 语句,所以我应该检查 _context如果抛出异常然后处理它,是否不为空?基本上我想确保 _context 在我完成后被处理掉,无论是否有异常。将 finally 添加到每个 try/catch 是否不正确?

将此方法添加到我的 DataManagerBase 类,然后在其他类中调用它是否可以达到目的:

 public void DisposeContext()
{
if (_context != null)
{
_context.Dispose();
}
}

最佳答案

经验法则是:不要处置不是您创建的对象。因此,您不应该在开始时提供的任何类中处理您的上下文。

不过,您应该在实际创建此特定实例的类中调用 context.Dispose()。当你这样做时 - 不应该有其他对象使用它。您要做的是避免您遇到的设计问题,而不是修复它。那是错误的,恕我直言。当您忘记在某处放置另一个空检查时,这会在某个时候反咬您一口。

使用您提供的示例代码可能如下所示:

void SomeMethodInOuterScope()
{
var context = new DataEntities();

var test = new Test(context);

try
{
test.InsertRecord(new Person());
...............
}
catch(Exception ex)
{
....
}
finally
{
context.Dispose();
}
}

这是另一个例子(当上下文不是本地的时候)

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();
}
}

关于c# - 处理我的 ObjectContext 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17345250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com