C# 如何最好地与类中的多个方法共享像SqlConnection这样的IDisposable对象?
有时我有几种方法,它们都连接到SQL Server。这意味着所有方法都包含IDisposable类型的局部变量,如SqlConnection 重用一个sqlconnection对象的最佳方法是什么?是否将其作为引用传入,并将其作为类级变量?另外,如果我在所有方法中使用它,是否需要通过ref传入它,并且类是否应该实现idisposable来处理变量C# 如何最好地与类中的多个方法共享像SqlConnection这样的IDisposable对象?,c#,C#,有时我有几种方法,它们都连接到SQL Server。这意味着所有方法都包含IDisposable类型的局部变量,如SqlConnection 重用一个sqlconnection对象的最佳方法是什么?是否将其作为引用传入,并将其作为类级变量?另外,如果我在所有方法中使用它,是否需要通过ref传入它,并且类是否应该实现idisposable来处理变量 感谢当涉及到SqlConnection时,它将发挥作用,因此在这种情况下,答案是-不要共享 一般来说,除非一次性物品是为共享而设计的,否则我不会尝试共
感谢当涉及到
SqlConnection
时,它将发挥作用,因此在这种情况下,答案是-不要共享
一般来说,除非一次性物品是为共享而设计的,否则我不会尝试共享它。在重新使用之前可能需要一些清理工作。我同意Oded-使用
SqlConnection
的最佳实践是不共享它
如果您需要在多个方法之间共享其他
IDisposable
对象,我建议您在您的类中实现IDisposable
。Oded的答案简洁而正确;您不应该在使用对象之间共享SqlConnections
一个更完整的答案是,如果您想集中控制SqlConnections,那么应该将它们封装在存储库对象中;集中式数据库访问对象。它有两个优点,一是将处理SqlConnections的代码放在一个地方,二是将实现细节隐藏在代码的其余部分,因此,如果更改为Oracle、MySql或SqLite,则不必重构系统中的所有内容。对存储库模式进行一些研究;应该有一个或两个示例可以“插入”到用于处理其自身DB调用的模型。实际上,当您将内容分离到多个方法中时,可能会出现“共享”连接(例如类内部)。为此,基于闭包的模式非常有效:
public void Do() {
WithConnection(o => {
o.Foo();
o.Bar();
});
}
private void WithConnection(Action<ThisClass> action) {
try {
con.Open();
action(this);
}
finally {
con.Dispose()
}
}
public void Do(){
WithConnection(o=>{
o、 Foo();
o、 Bar();
});
}
私有连接无效(操作){
试一试{
con.Open();
行动(本);
}
最后{
con.Dispose()
}
}
我同意在这种特殊情况下,池可能是你的朋友,但如果你想在几种方法中都有一个可用的资源(做一些通常会触发事件的事情,但你只想触发一次事件,等等),一个如图所示的闭包可以是你的朋友。我不会像Oded所说的那样共享
SqlConnection
,但是我认为如果你有一个DataContext
,那么在方法之间共享一个DataContext就可以了。我这样做的方式是让我自己的数据访问类实现IDisposable
,在我的数据访问类的Dispose
方法中,我会在我看来处置我的DataContext
:只需在需要的时候和需要的地方创建它-不要传递它,没有单一的全局静态连接-只需根据需要使用,尽可能晚地打开,尽可能早地关闭。所以请坚持我正在做的事情——用一种方法和另一种方法创建IDisposable对象?SqlConnection是一个很糟糕的例子,它可以是我想到的任何IDisposable对象。@dotnetdev-是的,我会这么做。例如,我不会尝试共享流。。。