2009-11-20 32 views
1

我有这段代码。如何做清理?

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

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

会这样吗?或者还有其他方式来照顾上下文对象吗?

回答

6

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

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

+0

这有一定道理,你说怎么样IDisposable.But与上面的方法,我想摆脱使用在这样 每一个方法调用使用的(实体上下文=新的实体()){ .... } SomeService类会有很多使用上下文对象的短方法。在每种方法中重复使用方法都是针对SOLID principe。 – user137348 2009-11-20 10:29:23

+0

尽管你仍然需要使用语句。例如,您不需要每个SomeService方法中的using语句 - 上下文可以传递到方法中。 – 2009-11-20 10:40:48

+0

同意@Jon。看看[这篇文章] [1]。 请注意,即使该文章按照通用设计模式(一次性模式) [1]进行分类,标题为实现完成并处置以清理**非托管资源**:http://msdn.microsoft.com/ en-us/library/b1yfkh5e%28VS.71%29.aspx – 2009-11-20 11:18:53

1

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

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