這是沒有一個明確的答案的一個問題,但是......
有您可以採取兩種路徑。強耦合系統或鬆散耦合系統。
對於強耦合系統,我可以爲二進制文件建議兩個目錄:第三方目錄和一個目錄,其中包含您公司構建的DLL,供其他開發人員參考。第三方DLL(公司外部)應位於源代碼管理中,以便所有開發人員從同一位置引用相同版本的第三方DLL,這樣可以避免開發人員機器不一致,並避免在每臺計算機上安裝第三方軟件。內部DLL不應該在源代碼控制中被引用,並且應該通過自動構建批處理文件或類似方式構建在每個開發人員機器上。在構建後步驟中,您可以將它們全部複製到同一目錄,只要開發人員獲得最新的源代碼管理和構建,每個人都擁有公司內部相同的DLL。
例如,獲取最新版本(使用批處理文件構建所需的所有項目),然後作爲後期構建步驟將輸出複製到常用項目。現在,所有其他項目都可以引用來自同一位置的通用compnay DLL和第三方DLL,並且每個人都是一致的。
問題是,這些引用是強耦合的,所以如果傳輸不正確,更改有時可能會出現問題。
一個鬆散耦合的系統使用一個框架,如MEF(管理擴展框架)和組件引用「Contract DLL」,它定義了組件的接口。該項目引用接口或合約DLL,並不真正關心實現,然後MEF爲您管理插件。
在這種情況下,您引用了接口DLL,但不是實現的實際DLL。
例如,假設我有一個名爲LogMessage的方法,它叫做ILog。
private ILog _logger;
_logger.LogMessage();
因此,在強烈耦合的情況下:Action.DLL直接引用Logger.DLL。
在一個鬆散耦合的情況下,Action.DLL引用了ILog.DLL(就是接口)。 Logger.DLL實現ILog.DLL。但是Action.DLL沒有直接引用Logger.DLL。
現在我可以擁有任意數量的提示ILog接口的DLL,但Action.DLL不會直接引用它們。這非常酷,並且是MEF和一般鬆散耦合中更令人興奮的功能之一,也就是不依賴的能力。
你如何選擇去哪裏,無論哪種方式都是可以接受的,我認爲鬆散耦合的想法最適合你的場景,因爲團隊只需要知道合同與實際實施情況。
我不會有一個大規模的合約DLL,我會嘗試將接口分成邏輯分組。例如,日誌記錄看起來像一個實用程序類型的interfance,所以我將創建一個具有ILog接口的實用程序合同DLL。它是如何分裂取決於你想要做什麼。或者每個接口都可以是一個合約DLL,但也許有點極端。
我會爲您的SDK提供穩定的接口。當您需要更改界面時,請開發一個新界面並棄用舊界面,但要實施一段時間。我會根據最新的SDK構建每個插件項目。我會考慮MEF或更好的爲我的DI工具,如Autofac。 – kenny
我可能更喜歡「使用給定穩定版本」的方法 - 並且使用NuGet,您可以輕鬆地將SDK和其他支持文件打包到NuGet軟件包中,這些軟件包可以輕鬆安裝到Visual Studio中,並且整潔地更新! –
我可以在公司內部實施NuGet包嗎?這意味着,允許其他用戶抓取最新的更新而不公開公開我們的代碼? –