Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何最好地与类中的多个方法共享像SqlConnection这样的IDisposable对象?_C# - Fatal编程技术网

C# 如何最好地与类中的多个方法共享像SqlConnection这样的IDisposable对象?

C# 如何最好地与类中的多个方法共享像SqlConnection这样的IDisposable对象?,c#,C#,有时我有几种方法,它们都连接到SQL Server。这意味着所有方法都包含IDisposable类型的局部变量,如SqlConnection 重用一个sqlconnection对象的最佳方法是什么?是否将其作为引用传入,并将其作为类级变量?另外,如果我在所有方法中使用它,是否需要通过ref传入它,并且类是否应该实现idisposable来处理变量 感谢当涉及到SqlConnection时,它将发挥作用,因此在这种情况下,答案是-不要共享 一般来说,除非一次性物品是为共享而设计的,否则我不会尝试共

有时我有几种方法,它们都连接到SQL Server。这意味着所有方法都包含IDisposable类型的局部变量,如SqlConnection

重用一个sqlconnection对象的最佳方法是什么?是否将其作为引用传入,并将其作为类级变量?另外,如果我在所有方法中使用它,是否需要通过ref传入它,并且类是否应该实现idisposable来处理变量


感谢

当涉及到
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-是的,我会这么做。例如,我不会尝试共享流。。。