我是否需要具有IDisposable类的Open和Close方法?

时间:2014-08-10 19:44:58

标签: c# class-design idisposable

我正在基于ADO.NET SQL连接开发一个简单的存储库类。该类是密封的并实现了IDisposable模式。

我打算保持简单,所以我在构造函数中打开SQL连接,并通过Dispose()方法关闭,以便它可以与using statment一起使用。

using (var r = new MyRepository(connectionString))
{
    ...
}

我最初对这个类有一对Open / Close方法,但我发现它使得类更难实现,而且使用起来更加混乱。

您通常是否拥有存储库类的Open / Close方法?如果是这样的话?

2 个答案:

答案 0 :(得分:4)

MSDN Dispose Pattern guideline说:

  

CONSIDER提供方法Close(),除了Dispose(),if   close是该地区的标准术语。这样做的时候是   重要的是,使Close实现与Dispose相同   并考虑明确地实现IDisposable.Dispose方法

因此,考虑到数据库交互中经常使用开放式术语,您的想法很好并且非常可行。

但是,如果它们的实现和使用使您的类更复杂到没有或最小的优点,那么就不要创建它们。最后,您总能更好地了解您的系统和要求,因此您应该根据具体情况做出决策,而不是基于抽象的指导方针和原则。

P.S。:无论您是否使用这些方法,您的系统都应该在最短的时间内打开连接,并在不再需要时立即关闭它们。当你必须在每次使用结束时放入一些特殊的处理代码时,通常很难完成。

答案 1 :(得分:2)

我建议不要直接在您的存储库类上实现IDisposable

相反,在存储库的每个方法中根据需要获取和释放资源。

public class MyRepostory : IRepository
{
     public IEnumerable<Foo> GetFoos()
     {
          using (var connection = new SqlConnection(connectionString))
          {
              connection.Open();
              // ... get the data, etc. ...
              return foos;
          }
     }
}