2013-08-27 51 views
2

我們有一個很大的.NET項目,它由許多模塊組成,這些模塊作爲Visual Studio庫項目實現並編譯到相應的程序集(DLL)中。如何從引用的.NET程序集中重新導出類型

我們有一個分層架構,我們通過設置Visual Studio項目/程序集之間的引用來管理模塊/層之間的依賴關係。這使我們能夠將API/SPI從實現中分離出來,並將不同的層分離開來,從而有效地執行我們體系結構的約束條件。但是,有時我們希望我們可以(過渡地)將一個裝配中導入的類型重新導出到任何具有對導入裝配的引用的其他裝配中。

例如,假設一個類型T在裝配A定義,裝配B引用A和裝配C引用B,像這樣:

A <-- B <-- C 

我們想「看」的類型T組裝C,而沒有在組件C中明確地設置對A的引用。我們想以某種方式轉口而不是A的參考B

可能嗎?

P. S.爲什麼我們要這樣做?因爲在應用程序中使用了一些類型(想想實用程序/幫助程序類或通用接口),並且在每個取決於這些類型的項目中複製引用會很煩人。此外,當我們重構我們的代碼並移動它們時,由於缺少引用,我們會收到很多錯誤消息。

EDIT

爲了澄清,這裏是一個簡單示意圖。

enter image description here

不僅Consumer B取決於B,而且對A,因爲B延伸A。但是,如果A被定義在與B的程序集不同的程序集中,那麼我們還要必須爲程序集A添加引用(同樣適用於提供者)。但是由於我們依賴於BB擴展了A的事實,因此對A的依賴關係遵循,因此沒有實際的需要來添加此參考。我們真正需要的是轉口BA的依賴關係。

這種情況怎麼會出現?假設只有一個接口B,並且您決定從B中提取通用接口(A),並將其置於單獨的程序集中,以便其他某些模塊可以在不添加對原始接口的依賴關係的情況下重新使用新接口。現在你去了:現在你必須添加一個引用到新的程序集,到處使用B

+0

我說你最好有一個包含所有「類型在整個申請中使用的」單核或輔助裝配被所有其他程序集引用。讓所有其他VS項目引用一個VS項目是一個乾淨且容易遵循的約束,比通過TypeForwardedToAttribute傳播常見類型用法要乾淨得多。 –

+0

我們從這種方法開始,但最終發現它並沒有很好地擴展:它導致了一個胖的核心模塊,它包含許多類,可以在一個地方爲所有不同的目的使用 - 這是一個全有或全無的解決方案。當然,問題並不是所有的類都在整個應用程序中被平等地使用:應用程序的某些部分需要這些類,而其他一些部分需要不同的類。把它們放在一個地方是不合理的。 – proskor

+0

「問題是,並非所有的類都在整個應用程序中被平等地使用」好吧,你沒有提到:)看起來你正在試圖找到一個技巧來逃避正確的代碼結構重構。這種重構將定義一組低層核心組件,高層將依賴於這些組件。 「應用程序的某些部分需要這些類,而其他一些部分則需要不同的類。」看起來像定義一組將成爲低級組件的類組是一個好的開始。 –

回答

1

在.net中的程序集有一個屬性,你可以告訴程序集它所期望的類型會在另一個類型中。

[assembly:TypeForwardedToAttribute(typeof(Example))] 

聽起來像是一個Type Forwarding使用我http://msdn.microsoft.com/en-us/library/ms404275.aspx

又見How do you explain type forwarding in simple terms?

+0

謝謝!我會檢查這一點。我不確定這是否真的是我們需要的(我們肯定不想指出哪些類型位於哪個組件中),但這是一個開始。 ;-) – proskor

相關問題