在哪里放置using(SqlConnection)?

3
我正在创建一个框架,用于为我的应用程序添加插件。每个插件都必须实现一个抽象类。然后将每个插件编译为DLL文件,主应用程序可以使用Directory.GetFiles(myPath, "*.dll")找到它们。
这一切都运作得很顺利,我可以在主应用程序中实例化我的插件并使用它们。每个插件基本上是一个仪表盘小部件,用户可以将其添加到其仪表板上以显示一些图形或图表。这意味着每个插件都有一个计时器,在每个计时器事件上,它会使用应用程序的SQL数据库中的数据刷新图形。
所以我的问题是,我应该把SqlConnection放在哪里?我应该创建一个SqlConnection并将其作为参数传递给每个插件,还是传递连接字符串并让每个插件创建自己的SqlConnection
如果我将应用程序的SqlConnection传递给插件,那么我想这将涉及一些管理插件内连接的工作。我显然必须检查它是否打开,如果它的状态是ConnectionState.FetchingConnectionState.Executing怎么办?这似乎很笨重。
但另一方面,考虑到多个用户将运行应用程序,并且每个用户可能选择了多个插件放在他的仪表板上,这可能会增加SqlConnections的数量。这是可取的吗?我应该考虑第三个选项,在这个选项中,插件将其查询发送给主机,主机将其与其他插件的查询排队,并在查询执行后向插件返回结果集?这样至少对于每个用户只有一个SqlConnection,无论他们选择了多少插件。
老实说,这最后一个选项对我而言似乎相当复杂,我还不太确定如何实现它。如果有人能指向一篇解释类似内容的文章,我会非常感激。
2个回答

4
个人建议是将连接工厂传递给插件,让它们根据需要创建和使用连接。这意味着您的应用程序控制连接字符串(尽管它们仍然可以从连接中读取它,除非您也将其抽象化),但它们可以自由地创建和使用连接。正如之前的答案所指出的那样,如果您只给他们一个单一的连接,那么就需要处理多线程问题和您自己提到的共享问题。
您可以采取简单的做法:
public interface ISqlConnectionFactory
{
   SqlConnection GenerateConnection();
}

public class SqlConnectionFactory : ISqlConnectionFactory
{
   private readonly string _connectionString;

   public SqlConnectionFactory()
   {
      _connectionString = "your connection string here";
   }

   public SqlConnection GenerateConnection()
   {
       return new SqlConnection(_connectionString);
   }
}

然后插件负责管理连接(例如打开,关闭,清除)。您可以通过这个来控制连接的不同级别,尝试检测失效的插件等等。

编辑

当然,您的插件应该使用using()语句:

public void MyPluginMain(ISqlConnectionFactory factory)
{
   using(var connection = factory.GenerateConnection())
   {
      // Do the work
   }
}

请记住,您的应用程序正在将维护这些连接的责任转移给插件,因此插件在完成后必须清理连接,无论是通过 using()语句还是在完成操作后实际调用 Dispose()。如果这是任何类型的“公共”API,则应将其包含在文档中。


谢谢,那听起来确实是更简单的方法。我对"连接工厂"不太熟悉。我现在正在谷歌上搜索,但如果你有一篇相关的文章或者其他方便的资料可以指引给我,那就太好了。 - Dewald Swanepoel
酷香蕉。我刚看到更新。看起来非常优雅。我认为这是我要追求的路线。但我想在这种情况下插件可能无法使用(SqlConnection)吧? - Dewald Swanepoel
1
连接工厂还可以将GenerateConnection()方法推送到列表中的每个连接,并在插件处理完毕时检查列表中的每个连接是否已被处理。 - Joel Coehoorn

2

不要在不同的插件之间共享连接,相反要在插件内部创建一个连接,甚至可以为每个查询创建一个连接。这不会影响性能,因为它们就是设计成这样使用的。

参见SqlConnection 和多线程


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接