2015-12-10 182 views
1

我有兩個項目說P1P2參考兩個項目

P1具有P2的參考文獻

所以我可以從P1訪問P2's methods。但是如果我想從P2訪問P1's methods那麼我該如何訪問它們?

我知道我不能添加P1's參考P2

如果可能的話?如果是,那麼如何?

+3

你不能只是創建一個參考,你是對的。這可能是一種使用反射或其他方式的方式,但是,理智的方法是將共享邏輯移動到第三個項目P3中,並從P1和P2中引用P3。 –

回答

3

正如其他人指出,循環引用是問題。它在編譯P1之前不能編譯P2,但是如果P1依賴於P2,它將無法編譯P1直到P2編譯完成...出現了問題?

現在的解決方案:

  • 最簡單的辦法:創建你把在P1和P2的共享代碼的共享庫。這個共享項目可以由P1和P2引用。

  • 更好的解決方案:創建一個在共享庫中定義的接口。在共享接口上基於P1的P2引用,而不是實際的實現。通過這種方式,您可以獲得更好的可測試解決方案,並且可以更輕鬆地替換部分代碼。

+1

很好解釋:) –

2

簡短的回答:沒有加入P1在P2項目的引用,因爲這將創建這是不允許的循環依賴的方式。考慮重構你的代碼並以不同的方式設計應用程序。一種方法是引入另一個包含對這兩個項目的引用的項目。

1

你不能從P2引用P1,因爲它會創建一個循環依賴。循環依賴指向糟糕的設計。有辦法解決這個問題,例如你可以將共享代碼重構成另一個項目。

3

實現此目的的另一種方法是將P1參考P2作爲解決方案中的項目,但僅通過其輸出DLL或EXE具有P2參考P1。

您失去了一些交叉項目/依賴項檢查,但它確實允許您交叉引用。

我曾與最初用VB寫的,但若干年後轉移到C#一個長期運行的WinForms應用程序做到這一點。所有新的Windows窗體都是用C#編寫的,它不能與VB窗體相同,但是需要一些VB窗體來調用新的C#窗體和verca。

編輯1

一個與此缺點是,如果P2引用P1,因爲它的項目輸出DLL/EXE,然後,當你清潔/重建方案,有一個錯誤,你的位置在輸出DLL/EXE不再存在,只有在解決該錯誤之後才能重新創建,但由於該解決方案缺少引用,因此無法再構建該解決方案。不是一個好的地方,所以請務必不時保留一份輸出DLL/EXE的副本,這樣如果它發生的話,你就可以擺脫這種困境。

+0

ohh ..我一定會嘗試這種方法 –

+0

通過雙向鏈接兩個裝配在一起,你已經做到這樣,使裝配不會沒有對方(失去代碼可重用性),但替代方案如果您想共享應用程序和dll之間的日誌記錄(以及狀態信息的顯示),則需要複製邏輯(違反DRY)。從概念上講,例如,dll不應該依賴於使用它的應用程序,但另一方面,有兩個單獨的日誌文件使得不太清楚「在應用程序中執行X會導致Y在DLL中發生」。 – jrh

+0

...在我看到的C/C++代碼中,這種鏈接並不總是可以避免的,並不罕見,它可能僅僅取決於你爲什麼首先創建一個獨立的DLL,IIRC Quake 3在其(可更換)引擎組件之間進行了相似的通信。 – jrh