我有这段代码。
创建上下文的新实例的基类。
public class Base
{
private Entities context;
public Base()
{
context = new Entities();
}
}
而不是从这个类继承的类。
public class SomeService : Base
{
public Gallery Get(int id)
{
return context.GallerySet.FirstOrDefault(g => g.id == id);
}
}
问题是,如何处理上下文对象?我在考虑基类中的析构函数,我只是调用上下文对象的dispose方法。
~Base()
{
context.Dispose();
}
这还够吗?或者还有其他方法来处理上下文对象吗?
答案 0 :(得分:6)
您的基类应该实现IDisposable
而不是终结器。当您可以直接访问非托管资源时(例如,表示Windows句柄的IntPtr),您应该只有终结器。
但是,我会尝试来制定一个不涉及此问题的设计。在可能的情况下,我尽量避免使用需要处理的成员变量 - 我倾向于在方法中获取资源,将这些资源传递给其他方法,然后在获取它们的相同方法中处理它们。您拥有的IDisposable
实现越少,您可能需要管理的资源生命周期复杂性就越少。显然有时这是不可避免的......
答案 1 :(得分:1)
在你编写它时使用析构函数实际上是错误的,因为框架并不能保证上下文对象在最终确定时是有效的。
您应该在对象上实现IDisposable并在那里处理上下文。如果上下文具有非托管资源,则它应该具有自己的终结器。