2010-02-18 167 views
16

我有一個c#解決方案,它由許多項目組成。C#項目參考的問題

我有一個項目,是我的baseassemblies持有其他項目中使用的所有公共信息。所有其他項目都引用了基本程序集。然而

我加入我的baseassemblies一個dll引用的所有其他項目無法看到它。

我怎樣才能讓這個其他的項目可以看到,baseassemblies被引用的DLL?我不想將DLL添加到所有項目,因爲這會破壞我的baseassemblies項目的目的。

回答

23

正確的做法是爲您的其他組件就是不用其他DLL的參考。正確地做到這一點的方法是不讓基本程序集公開該DLL中的任何類型。將所需的所有功能封裝在基本程序集中,並確保使用基本程序集的人員無需知道底層dll的基本程序集正在使用。否則,每個將引用基本程序集的項目,如果他們需要使用該dll中包含的內容,他們將不得不引用它。

+2

+1你打我吧。我同意100% – 2010-02-18 16:18:37

+2

在許多情況下,這對大型代碼庫並不實用。這是一個很好的「理論」答案,但它需要編碼和測試方面的額外努力才能使其發生(經常)不增值。我並不是說它當然是不適合的...... – 2010-12-06 17:05:38

9

在.NET中沒有傳遞引用。如果程序集需要引用另一個引用,它必須直接這樣做,它不能「繼承」來自另一個引用的引用。

注意,項目只需要引用它直接使用類型的組件。如果A使用B,B使用C,但A不直接使用C,那麼A只需要直接引用B(加載器將處理B引用C)。

3

總之,你不能這樣做。您需要添加對包含您要使用的代碼的DLL的引用,否則它將無法看到它。

我的建議是建立在你的「BaseAssemblies」項目的一層,你可以從你的應用程序基本上創建了一個分層架構訪問。

例如

應用層 - 使用IDataClass
業務邏輯層 - 定義IDataClass
數據訪問層 - MyRawDataClass(實現IDataClass)

從例如,應用層只需要一個參考到BAL以便能夠與DAL交互。

0

你可以有必須由你的「其他」 DLL中實現你的BaseAssemblies導出接口。另外,您的BaseAssemblies需要這些類的一些「類工廠」功能。

0

其他海報是正確的:你不能這樣做。這是恕我直言,Visual Studio的可悲。 「使」處理這種清潔在20年前的餡餅...

0

在有些情況下你的項目是指一個實例這反過來又指B,而當你建立,B並不總是出現在bin文件夾,你只知道這是代碼運行時的情況。有一個相關的SO問題HERE。人們用奇怪的方式解決了這個問題,但我特別喜歡約翰亨特的解決方案。這SO thread還討論了在您使用生成事件來達到理想的效果的解決方案。