2015-04-25 48 views
3

我正在创建一个框架来为我的应用程序添加插件。每个插件都必须实现一个抽象类。然后将每个插件编译为主应用程序可以找到的一个DLL Directory.GetFiles(myPath, "*.dll")放哪里使用(SqlConnection)

这一切都很顺利,我可以在主应用程序中实例化我的插件并使用它们。每个插件基本上都是一个仪表板小部件,用户可以将其添加到仪表板以向他显示一些图表或图表。这意味着,每个插件都有一个计时器,并且在每个计时器事件中,它都会使用来自应用程序的SQL数据库的数据刷新图形。

所以我的问题是,我在哪里把SqlConnection?我是否创建一个SqlConnection并将其作为参数传递给每个插件,或者是否传递连接字符串并让每个插件创建它自己的SqlConnection

如果我将应用程序的SqlConnection传递给插件,那么我会想象它会涉及到一些管理插件内部的连接。我显然必须检查它是否已打开,如果状态为ConnectionState.FetchingConnectionState.Executing,我该怎么办?它看起来很笨拙。

但另一方面,考虑到多个用户将运行该应用程序,并且每个用户可能在他的仪表板中选择了多个插件,它可以加起来多达SqlConnections。这是可取的吗?我应该考虑第三种选择,插件将查询提交给主机,该主机将其与来自其他插件的其他查询进行排队,并在查询执行后将结果集返回给插件?这样至少每个用户只有一个SqlConnection,无论他们选择了多少个插件。

说实话,这最后一个选项对我来说似乎相当复杂,我不确定我是如何实现它的。如果任何人都能指向我的文章,解释类似的东西,我真的很感激它。

回答

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); 
    } 
} 

然后插件是负责管理连接(例如打开,关闭,处置)。还有很多事情可以通过这种方式对连接进行不同级别的控制,尝试检测不当行为的插件等。

编辑

Absoutely,你的插件应该使用using()声明:

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

牢记您的应用程序正在改变责任心维护这些连接的插件,该插件清理完成后的连接,无论是using()声明还是在完成之后实际调用Dispose()。如果这是任何一种“公共”API,这应该是您文档的一部分。

+0

谢谢,这听起来像更简单的方法。我不熟悉“连接工厂”。我现在使用谷歌搜索,但如果你有一篇文章或一些方便的东西,你可以指出我会很棒。 –

+0

@DewaldSwanepoel看到我的更新:) – CodingGorilla

+0

酷香蕉。我刚看到更新。看起来非常优雅。我认为这是我会追求的路线。 我不知道这个插件能在这种情况下使用(SqlConnection)吗? –

2

您不应该在不同的插件之间共享连接,而应该在插件中创建一个连接,或者甚至针对每个查询。这不会损害性能,它们被设计成像那样使用。

SqlConnection and multithreading