我正在创建一个框架来将插件添加到我的应用程序中。每个插件都必须实现一个abstact类。然后将每个插件编译为DLL,主应用程序可以使用Directory.GetFiles(myPath, "*.dll")
这一切都在游泳,我可以在主应用程序中实例化我的插件并使用它们。每个插件基本上都是一个仪表板小部件,用户可以将其添加到他的仪表板中以向他显示一些图形或图表。这意味着,每个插件都有一个计时器,并且在每个计时器事件中,它都会使用来自应用程序SQL数据库的数据刷新图形。
所以我的问题是,我在哪里放SqlConnection
?我是否创建了一个SqlConnection
并将其作为参数传递给每个插件,或者我是否传递连接字符串并让每个插件创建自己的SqlConnection
?
如果我将应用程序的SqlConnection
传递给插件,那么我认为它将涉及一些管理插件内部的连接。我显然必须检查它是否已打开,如果状态为ConnectionState.Fetching
或ConnectionState.Executing
,我该怎么办?这看起来很笨拙。
但另一方面,考虑到多个用户将运行该应用程序,并且每个用户可能在其仪表板中选择了多个插件,它可能会增加多个SqlConnections
。这是可取的吗?我应该考虑第三个选项,其中插件将其查询提供给主机,该主机将其与其他插件的其他查询进行排队,并在查询执行后将结果集返回到插件?这样,至少每个用户只有一个SqlConnection
,无论他们选择了多少个插件。
老实说,这最后一个选项对我来说似乎相当复杂,我还不太清楚我是如何实现它的。如果有人能指出一篇解释类似内容的文章,我真的很感激。
答案 0 :(得分: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()
语句之后,或者在{I}完成它之后实际调用Dispose()
。如果这是任何类型的公共' API,这应该是您的文档的一部分。
答案 1 :(得分:2)
您不应该共享不同插件之间的连接,而是在插件中创建一个连接,甚至是每个查询。这不会影响性能,它们的设计就是这样使用的。