怎么做清理?

时间:2009-11-20 09:55:48

标签: c# oop inheritance dispose

我有这段代码。

创建上下文的新实例的基类。

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

这还够吗?或者还有其他方法来处理上下文对象吗?

2 个答案:

答案 0 :(得分:6)

您的基类应该实现IDisposable而不是终结器。当您可以直接访问非托管资源时(例如,表示Windows句柄的IntPtr),您应该只有终结器。

但是,我会尝试来制定一个不涉及此问题的设计。在可能的情况下,我尽量避免使用需要处理的成员变量 - 我倾向于在方法中获取资源,将这些资源传递给其他方法,然后在获取它们的相同方法中处理它们。您拥有的IDisposable实现越少,您可能需要管理的资源生命周期复杂性就越少。显然有时这是不可避免的......

答案 1 :(得分:1)

在你编写它时使用析构函数实际上是错误的,因为框架并不能保证上下文对象在最终确定时是有效的。

您应该在对象上实现IDisposable并在那里处理上下文。如果上下文具有非托管资源,则它应该具有自己的终结器。