2013-11-01 38 views
0

我的程序集中有兩個單獨的名稱空間:DataAccessDomainLogic通過反射檢查名稱空間之間的依賴關係

我需要一個代碼片段來檢查DomainLogic中的任何類都取決於命名空間DataAccess

你會怎樣呢? PS:我認爲我在Mark Seemann的精彩書籍Dependency Injection in .Net中看到過這樣一個單元測試的例子,但是我沒有在這裏找到它,也找不到通過Google的例子。

編輯

由於所有的反應至今指出,我應該只是拆分這些相互依存的類分爲兩個不同的組件,我想指出的是,這是目前不是一個選項(雖然這確實是一個我的主要目標到底)。我正在處理遺留的代碼,現在我無法用一個龐然大物重構它。單獨的命名空間和測試它們之間的依賴關係是一箇中間步驟。只要測試通過,我就可以繼續並將代碼的一部分移動到另一個程序集中。

+1

爲什麼你不能只是把它們放在單獨的組件? – Agares

+0

我知道這不是你要求的,但是一種選擇是將它們移動到單獨的項目中,而不是從'DomainLogic'引用'DataAccess'。 –

+0

@Agares:我現在不能這樣做,因爲這是遺留代碼,我正在重構它。我想先征服混亂,首先將類分成不同的名稱空間,然後再將不同的程序集分開。即使那樣我也想要一個測試來檢查'DomainLogic'assembly不依賴於'DataAccess'。 – EagleBeak

回答

1

程序集中的所有代碼都可以合法地訪問程序集其餘部分中的公共代碼和內部代碼。所以,即使可能,這樣的單元測試也不是好主意。

如果將DataAccess類型拆分爲單獨的項目並將其全部內部化,則無法訪問它。顯然不是你想要的。但是,通過分割它,您可以確保DomainAccess可以訪問DomainLogic,但反之亦然。這大概就是你想要的。

與此同時,不是嘗試開發單元測試來檢查「DomainLogic不能訪問DomainAccess」的規則,而是使用代碼評論。假設你正在使用敏捷方法(如果沒有,那麼做!),所有活動都將記錄爲任務。除非理解和接受您的規則的人已經審查了任務的代碼更改,否則任何任務都不能被視爲「完成」。打破規則,任務失敗代碼審查,並且在完成之前必須重新編寫。

+0

請參閱我的問題中的編輯。我正在重構遺留代碼。 – EagleBeak

+0

@EagleBeak我可以理解這一點。我已經更新了我的答案,並提出瞭如何處理這個問題的建議。 –

+0

你是完全正確的,我很欣賞這個輸入,但這仍然不是我所要求的。我需要一個工具來促進這個具體的重構任務。我編輯了我的問題的措辭以澄清,代碼段是我需要的。 (實際上,自動化測試無論如何不會有多大意義,因爲它總是會失敗,只要它通過,我就可以創建新的程序集並且不再需要該測試。) – EagleBeak

0

有一個工具可以做到這一點:根據您的規則檢查名稱空間依賴關係,並在構建時報告違規行爲,作爲警告或錯誤。 它被稱爲NsDepCop,免費,開源。

規則的配置會是這個樣子:

<NsDepCopConfig IsEnabled="True" CodeIssueKind="Warning"> 
    <Allowed From="*" To="*" /> 
    <Disallowed From="DomainLogic" To="DataAccess" /> 
</NsDepCopConfig>