2015-04-25 37 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