我正在基于ADO.NET SQL连接开发一个简单的存储库类。该类是密封的并实现了IDisposable模式。
我打算保持简单,所以我在构造函数中打开SQL连接,并通过Dispose()方法关闭,以便它可以与using statment一起使用。
using (var r = new MyRepository(connectionString))
{
...
}
我最初对这个类有一对Open / Close方法,但我发现它使得类更难实现,而且使用起来更加混乱。
您通常是否拥有存储库类的Open / Close方法?如果是这样的话?
答案 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;
}
}
}