2013-04-17 47 views
1

我有一種情況,即我想要在多個應用程序中使用的功能。特別是,我有一個Repository採用C#類庫的形式,其中包含EF.edmx,存儲庫和UnitOfWork等通用的應用程序。鏈接文件和添加另一個項目作爲參考之間的區別?

我很沮喪,我不能更清楚地看到圖片,因爲我應該明確瞭解差異;我很重視。不過,我認爲我無法看清每種選擇的影響和整體差異。

我已閱讀此鏈接:How do you share code between projects/solutions in Visual Studio?它提供了一些很好的建議,但這兩個建議似乎持有水。我想更好地瞭解每個人的下游影響,並瞭解哪些是我需要的正確選擇。

我相信,隨着文件我會創造在申請-2的另一Repository項目,但使用鏈接的文件進行什麼包括新層。

我相信,隨着加入的應用-1 Repository作爲參考到Application-2的工作,但我不知道的更改代碼的影響將是什麼。

我基本上需要知道哪種方法會產生正確的結果,我需要在1..n應用程序之間共享存儲庫層?

回答

4

如果存儲庫/的UnitOfWork,要共享跨多個獨立項目 的實現,你有以下選擇:

  1. 認沽源*的.cs一些常見的文件夾中的文件,並添加這些文件作爲鏈接到每個項目 。

    優點

    • 所有bug修復/功能均自動進入所有項目。
    • 您可以調試您的存儲庫代碼。
    • 由於代碼是作爲一組文件共享的,因此每個解決方案都可以擁有自己的自定義數據訪問項目,該項目可以擴展基本共享存儲庫代碼。


    缺點

      在兩個編譯的項目複製
    • 相同的代碼,如果在某一點PROJECT1將 開始根據項目2,將有一個類名/命名空間衝突,您將不得不手動解決(請參閱下面的Tom Blodget的評論)。
    • 對共享類的代碼更改必須小心謹慎,而不是破壞現有功能(例如,刪除已在其他項目中使用的存儲庫方法)。
    • 如果共享代碼鏈接到多個庫中,則它與複製粘貼它基本相同。


  2. 提取普通代碼類庫,包括編譯的.dll組件作爲基準 到兩個項目。

    優點

    • 防止出現意外的合同變更。
    • 可能具有單一版本的存儲庫實現 - 在GAC中註冊
    • 可能完全隱藏實現細節(使存儲庫內部/密封),並僅公開接口。
    • 類庫就像黑匣子一樣,迫使你實現更好的契約接口/ API。


    缺點

    • 潛在需求,支持集的多個版本,例如當PROJECT1從庫V2.0需要新的功能,和V2.0包含重大更改阻止其在project2中使用。


  3. 提取到單獨的類庫和包括庫作爲項目引用

    優點

    • 同選項1,除了存儲庫代碼incapsulated成一個共享庫,並作爲完整的解決方案進行部署。擴展它可能導致突變。


    缺點

    • 降低控制權的變化,如選項1 - 改變庫 源代碼可以導致其他項目的潛在重大更改。

但同樣,這一切都取決於許多因素 - 你使用的是什麼樣的版本控制, 這將是你的項目的生命週期中,是否有多個團隊在開發這些項目,這些項目將會如何部署以及它們是否會連接。這一切都會影響最終決定。

+1

將相同的類文件編譯爲多個程序集不會產生衝突(或者如果您願意,不會產生無法解決的衝突)。這些類將是不同的類型。使用VS和csc很容易處理它們 - 只需使用[extern別名](http://msdn.microsoft.com/en-us/library/ms173212(v = vs80).aspx)。真正的問題是它們會是不同的類型,如果你想在它們之間進行轉換,你必須編寫類型轉換方法。如果他們暴露給COM,那麼COM就無法區分它們。 –

+0

謝謝,不知道這是可能的。我編輯了我的答案。 – Alexander

+0

@Alexander - 如何選擇#2的分支,即:「將通用代碼提取到類庫中,並將此新的重構類庫添加爲*現有項目*到項目#2」。這與引用.dll相反。我喜歡將該引用添加到現有項目的想法,因爲我可以在兩個項目中遍歷代碼。 .dll不允許我這樣做(沒有一些工具的幫助來反編譯和插入)。 – atconway

相關問題