2010-01-12 131 views
7

我正在努力避免循環依賴。我知道我需要使用接口來隱藏實現,但是如何處理兩個程序集的情況,其中每個需要從另一個實例化類還是從那裏調用一個靜態方法?循環依賴關係 - 再次

編輯:

我明白,這可以通過使用單件組裝固定。我們不止一個,原因如下:

  • 我們的「系統」由幾個組件組成。一個客戶只能有一個組件,或者更多 - 所以我們做的是爲不同的組件創建不同的組件。這是有道理的 - 爲什麼你會部署你不需要的東西 - 是不是浪費內存?
  • 對於更多組件(大多數是幫助程序類)而言通用的東西已轉到另一個程序集 - 再次,並非所有組件都需要所有幫助程序類,因此有更多程序集但是,這兩個應用程序可以相互交談 - 系統對於醫生向護士發送系統請求,請求返回等等 - 這裏是實際問題的地方

讓這兩個組件相互對話實際上只是我們遇到的一種情況循環依賴衝突之前。它不時發生,當它發生時,我們需要弄清楚如何解決它 - 移動一些類 - 有時我們需要添加一個新的程序集。

現在我們有像8-10組件,它看起來像你越有越快,他們會添加:) - 例如,我們添加使用自定義屬性的通用功能 - 所以我們增加了一個裝配只是屬性 - 以防萬一我們不衝突得到未來

這是要走的路?我真的感覺我們正在做的事情基本上是錯誤的:)

我真的很感激您的輸入。

+0

不知道你解釋得不夠好。也許你應該只使用一個組件。 – 2010-01-12 19:42:04

+1

請編輯問題以包含域上下文和/或一些示例代碼。 – 2010-01-12 19:50:32

回答

10

我會盡量拉違規類型伸到這兩個「父」組件引用第三個「共同」集會。

我會問,爲什麼你在第一個地方需要多個組件,然而,當他們倆相依爲命。組件是部署的單位,並且可以彼此分開版本化。如果你不需要這個功能,我會把所有東西都打包成一個單獨的程序集並完成它。這增加了加速構建和簡化部署的額外獎勵。

請嘗試爲您的問題添加更多上下文 - 如果我們確切知道您正在嘗試做什麼,可能會提供一些詳細信息。

編輯重新您添加:具體回答關於是否多個程序集是要走的路你的問題,考慮一下:我曾經在一個代碼庫這樣與Visual Studio 2008,那裏有大約20個單獨的項目文件立即在解決方案中打開。這20個項目都支持單個主EXE的DLL。這些項目沒有與其他產品共享,也沒有奇怪的版本要求。

使用此解決方案是一場噩夢。花了5分鐘的時間Visual Studio來編譯解決方案。在命令行中用MSBuild編譯需要2分鐘。這使得增量變化成爲挫折和痛苦的一種鍛鍊。由於所有這些項目都用於製作主要的可執行文件,因此它們都不能被卸載以加快編譯速度,並且執行任務的目的是防止將項目分解爲單獨的解決方案。

如果你最終得到這樣一個單一的解決方案,當我說你和你的隊友會反抗一天時,相信我......我的建議是將程序集分解成他們自己的解決方案,將任何程序集很可能會一起改變;然後創建一個自定義構建任務,將最終程序集複製到所有其他程序集可從中引用的公用文件夾中。

+0

Erik,謝謝你的評論 – 2010-01-21 10:58:11

+0

沒問題 - 我希望它有幫助。 =) – 2010-01-21 14:26:53

3

你能把普通的東西放在自己的裝配中嗎?

我同意一位評論者的意見,我們可能需要更多信息。

爲什麼你有2個程序集?

有沒有理由一切都不在一個程序集?

這些組件是如何連接的?只是通過參考或有WCF,等組件涉及?

我們已經給你最簡單的答案,但也許還有更多比我們可以通過您簡要說明一切。

+0

通常你有太多的課。你可能需要分解一些類來找到常見的東西。 – 2010-01-12 19:42:58

1

避免它的一種方法是使用代理/業務結構。

AssemblyA.Proxy - 包含兩個類:一個接口(姑且稱之爲IServices),和另一個類負責調用AssemblyA.Business方法。

AssemblyA.Business - 包含一個類,它實現了在IServices上聲明的方法。

AssemblyB.Proxy - 模擬到AssemblyA.Proxy

AssemblyB.Business - 模擬到AssemblyA.Business

這樣,每個代理組件將只引用了業務邏輯,他們應該至。 AssemblyA.Proxy將提及AssemblyA.Business; AssemblyB.Proxy將提及AssemblyB.Business。 AssemblyA.Business會引用AssemblyB.Proxy等等。

不知道它是否清楚,但希望它有幫助。