27

我在我的應用程序中創建了2個虛擬項目,並將它們命名爲BALDAL。當我構建它們時,它們會成功構建。如果我在DAL項目中添加對BAL的引用,它會很好地添加。但同時加入了DAL參考BAL項目,我得到以下錯誤:由於循環依賴錯誤,無法添加項目引用

A reference to DAL could not be added. Adding this project as a reference would cause a circular dependency.

誰能幫我解決這個問題?

+2

只需在Google快速搜索中嘗試一些頂級條目即可。 http://en.wikipedia.org/wiki/Circular_dependency。在http://stackoverflow.com/questions/308915/why-are-circular-references-in-visual-studio-a-bad-practice在SO另一個問題很好解釋 –

回答

8

您只能以一種方式參考,否則您會得到像您所說的錯誤。只要做到這一點:從你的DAL刪除參考到你的BL,並從你的BL到你的DAL做一個新的!

+0

我想補充兩個作爲參考根據我的代碼 – Venkat

+6

使用比...更通用的圖層更具體:在您的項目中添加一個名爲common的新圖層,然後將您的業務對象放入此圖層中。現在,您可以在所有BL和DAL圖層中引用此圖層。 – jefsmi

+0

我只是添加這樣只創建2個新項目,但我仍然得到問題 – Venkat

2

這將導致循環依賴。你可能想要做的是有一個主要的應用程序項目,它涉及BAL,然後是BAL引用DAL。數據訪問不應該引用業務邏輯。

10

「層」的概念隱含着高層依賴於低層,而不是相反。如果2個「圖層」是相互依賴的,那麼其中一個不會高於另一個,它們不是任何有意義的圖層,因此可以認爲是在同一圖層中。 Studio對於項目依賴性強制執行相同的基本原則,適用於架構組件或模塊。如果您使用此原則 - 將您的項目視爲設計模塊而不是隻是把所有東西都投入到一個單一的項目中 - 你將會擁有結構良好的代碼庫,隨着規模的擴大,它將給你帶來更少的問題。

+22

-1因爲我仍然不知道,在閱讀你的答案後,如何讓VS做我需要的。 –

+1

-1,因爲這沒有回答用戶或我自己的問題,他們有相同的情況。 – SnapJag

+3

您提出了一個非常有效的觀點,但是並不總是可以重寫一個您繼承的大量代碼庫,而這個代碼庫的編寫很糟糕。 – ElGavilan

-6

要解決此問題,請在項目DLL構建完成後通過瀏覽添加參考。不要從「項目」選項卡中選擇它。

+5

在另一個項目的bin目錄中添加對DLL的引用通常是非常糟糕的事情,特別是如果項目處於相同的解決方案中並且您有構建服務器建立。它會引起頭痛。 – TrueWill

+4

項目之間的循環依賴關係是一個非常糟糕的主意,並且會產生不可重現的構建。每次構建時,都會引用先前構建的DLL。 –

23

這裏就是你需要做的:

  1. 右鍵點擊Solution Explorer中的DAL項目,然後選擇項目依賴於上下文菜單

  2. 現在您將看到一個窗口,顯示DAL項目的項目依賴關係。確保沒有檢查BAL。

現在,你應該能夠增加您的參考...

我希望這可以幫助我試圖保持它的簡單和直截了當地。

說明:

你的DAL不應該能夠訪問BAL。您的代碼參照依賴關係應該是這樣的:

MVC項目 - > BAL - > DAL

的MVC項目應參照BAL,BAL中應引用DAL。像這樣設置你的項目。讓它工作,然後你會更好地理解爲什麼這個設置更好。

鑑於:

  1. 數據 = 原始數字和字符串
  2. 信息 = 處理過的數據到一些有意義

Cosider第e以下: UI應該從BAL獲得它的信息,其可以基於DAL組成它的數據

1

這只是發生在我身上。你有一個循環依賴,即兩個項目都相互引用。你需要使其中一個獨立於另一個。需要一些時間,它發生得如此之快。一秒鐘,我很高興地編碼,接下來我有45個這樣的錯誤。只花了一些時間,但它也使您的架構/程序結構更好,幫助您正確地分類依賴關係。

0

在我來說,我複製一個項目文件而不生成新ProjectGuid。由於Visual Studio使用ProjectGuid來唯一標識項目,因此它假定項目試圖引用自己。

0

發生在我這個問題時,我正在建造幾層像倉庫接口層,存儲庫服務層,SQL服務層,其餘的業務層和我的主要WPF界面層WPF應用程序。

  • 我解決了這個錯誤。我注意到一些圖層是不必要地引用其他項目的 。我刪除了這個不必要的 參考。
  • 然後我注意到,我的一些服務層和庫層 有我的WPF UI項目作爲參考(我的啓動項目);這是 什麼是創建循環引用。我刪除了這個。

============================================ ============================

結論:檢查每一個項目中引用的依賴並確保沒有任何不必要的參考。確保子圖層不參考引用中的啓動項目。

希望我有幫助。