2010-07-20 44 views
3

我可以限制來自特定名稱空間的類引用另一個特定名稱空間中的類嗎?這兩個名稱空間都存在於同一個.NET程序集中。我可以強制C#中名稱空間之間的依賴關係嗎?

例子:

namespace LegacyCode 
{ 
    class LegacyClass { ... } 
} 

namespace NewCode 
{ 
    class NewClass {...} 
} 

我不想從「NewCode」類能夠引用類的「遺留代碼」。

選項:

  1. 有不同的組件(使部署困難,構建需要更長的時間)
  2. 使用像NDetect工具(費錢!)

沒有人有任何其他的想法?

回答

10

考慮與Obsolete attribute標記的類。這會導致任何本身未標記爲「Obsolete」的代碼在編譯期間生成警告。

啓用「將警告視爲錯誤」的項目文件的「構建」選項卡上的設置,以使此警告與錯誤失敗編譯代替。

編輯:

同意,獨立的組件是爲了便於淡出這個代碼一個很好的策略。這不會阻止人們提及它。過時的屬性表明這個代碼已經過時了。

編輯#2:

感謝Dan Tao您指出過時屬性的overloaded constructor。這意味着您可以強制使用某件事物是否應視爲錯誤,而不必將警告視爲錯誤。還有一個有用的選項可以指定一條消息來指導用戶解決方法。此消息在編譯期間顯示在錯誤/警告中。

+1

其中一個'ObsoleteAttribute'類的重載[構造函數](http://msdn.microsoft.com/zh-cn/library/961hff5d.aspx)需要一個'bool'參數來指定對標記類的引用是否應該導致編譯錯誤。 – 2010-07-20 15:25:02

+0

謝謝丹 - 我以前從未注意到! – MPritchard 2010-07-20 15:29:41

7

記錄設計,與人交談,審查代碼。不要試圖把技術扔在人們的問題上。 (審查部分可以成爲像NDetect工具更有效,雖然)。

如果你真的需要設計變更的隔離,去單獨的組件:這是預期的設計機制。但要確保你有一個合理的版本控制方案,無論是接口還是實現。

+0

原則上我認爲你是對的 - 那是我們目前的解決方案(溝通規則)。 但實際上這並沒有奏效。一位經驗豐富的開發人員檢查了一個打破依賴性的新課程 - 審查人員也錯過了這個課程。這就是爲什麼我想要更嚴格的控制方式。 – GarethOwen 2010-07-20 13:15:53

+2

好聽!我認爲你必須硬着頭皮接受費用,或者以單獨的程序集管理的形式,或者依賴執行工具。我不知道有任何NDepend的自由替代品(當然不包括它的功能集)。但是,依賴打破會花費你的錢,特別是如果維護幾年 - 前期投資,以避免後來的技術債務聽起來更可取。 – 2010-07-20 13:27:56

3

我認爲單獨的程序集是唯一可行的解​​決方案。

3

MS使用System.ObsoleteAttribute屬性來標記過時的/傳統的代碼。該屬性提供了一個創建編譯器錯誤的ctor。雖然,如果沒有太多遺留類,我會使用它。

+0

我不知道Obsolete屬性 - 聽起來不錯。但不幸的是,我們確實有很多遺留類:( – GarethOwen 2010-07-20 13:17:14

+2

相信我 - 花費一個下午複製和粘貼[Obsolete]是值得的。如果您的代碼在文件夾中正確佈局,那麼所有過時的代碼都在同一個文件夾中,嘗試在Visual Studio中使用正則表達式來查找和替換我認爲您希望將其應用於類,枚舉和結構 – MPritchard 2010-07-20 13:21:39

+0

老闆不太滿意將90%的代碼庫標記爲Obsolete – GarethOwen 2010-07-20 13:30:18

1

正如其他人所說,使用過時的屬性(即使你有將其重命名)。

但更進一步。刪除任何不再使用的傳統方法。這會阻止某人稍後使用它。由於過時的屬性會隨着時間的推移而下降,因此您應該開始查看編譯器警告。

您甚至可以每天進行一小時的測試,以儘可能多地消除編譯器警告......也許您在下班後爲每日贏家購買啤酒(或軟飲料......)。

+1

我們將其作爲構建統計添加到我們的TeamCity構建中。看到一個緩慢趨勢爲0的圖有一些好處 – MPritchard 2010-07-20 15:29:20

相關問題