2010-07-16 120 views
9

我在想這裏,你們如何組織你的項目,在功能,範圍等方面。組織C#項目的最佳方式是什麼?

你有一個單元測試項目,一個項目的類庫代碼,一個項目的用戶界面?

或者你只是將所有這些分成不同的文件夾?

我在想,通過項目分離這些東西比較容易,因爲您的中央代碼庫位於一個地方,不需要直接引用UserInterface(無WinForms依賴項)或UnitTests。

有沒有意見?

回答

13

我嘗試將項目分成您可能稱爲「部署單元」的項目。換句話說,「我如何部署這些程序集?」

因爲我顯然沒有部署單元測試,所以他們在自己的項目中。

然後,我將UI和「業務邏輯」劃分爲不同的項目。如果我保持這些分離線乾淨,我可以用新技術或基礎結構替換我的UI層(認爲WPF與ASP.NET),並且仍然重用兩者的「業務邏輯」程序集。我只介紹一個理解業務邏輯接口的新UI層。

我也嘗試爲解決方案之間可能共享的代碼保留一個單獨的庫。這將是我的數據訪問實用程序,文件解析實用程序以及我在建立項目時反覆使用的其他工具。我可以將這些程序集包含到我的新解決方案中,並獲得我已經投入了時間的所有功能。

希望有所幫助。我已經參與了

2

在Stack Overflow和Google上進行一些搜索 - 還有其他人問過同一個問題。

一些注意事項:

Visual Studio中需要更長的時間來編譯了許多項目,比單一的大項目的解決方案。不要過分細分您的解決方案。

微軟的Composite Application Guidance有一個有趣的方式來劃分項目。有一個基礎設施項目,一個引導程序項目,然後爲每個「模塊」代碼項目。

目前,我正在開發一個項目,將項目分開,就像您的示例一樣:基礎架構,業務邏輯,GUI和單元測試。

我更喜歡按目的組織文件,而不是類型。例如,我創建了名爲「Communication」和「Interop」的文件夾,而不是「Events」和「Interfaces」。

1

你有單元測試 一個項目,爲類庫 代碼一個項目,爲用戶界面一個項目?

非常多這個。通常保持UI精簡併將任何業務邏輯移入其自己的項目中,每個業務邏輯項目都有一個測試項目。

0

我按照您所描述的按裝配類型拆分項目。至少有可執行的主項目(如果它是一個應用程序)和一個或多個類庫是很好的。如果它是一個Windows應用程序,絕對儘可能將代碼與代碼分開。 WPF應用程序在完成這一任務方面做得非常出色。

除此之外,我可以借用的一些其他建議絕對是收集一些第三方類庫,並在代碼重用明顯或顯而易見時編寫自己的一些類庫。

3

最後幾個項目 - 我們結束了下面的結構(所有WPF棱鏡項目):

xxx.Shell.Exe

xxx.yyyModule.dll(X 4- 7)

xxx.Tests

xxx.Model

xxx.Common

而對於那些使用WCF - 增加:

xxx.Backend

xxx.DataContracts

所有在一個解決方案(我們住與長期積累的時間...)將其分割成分離解決方案在重構時引入了太多問題。到目前爲止 - 它對我們非常有用。

4

一些圖案,我在一個解決方案中的項目組織發現有用:

我幾乎總是有一個「共同」或「utils的」項目。這個項目應該只有很少的依賴關係,因此它可以很容易地在我的解決方案的任何地方(或可能在其他解決方案中)重新使用。你會驚訝地發現有多少小幫手將會進入這個項目。

我總是試圖將我的業務邏輯分成一個項目(或更可能是一組項目),並將我的引導程序/提供程序代碼放入不同的項目(或一組項目)中。我的引導程序/提供程序類是特定於上下文的(它們可以假定存在HttpContext或命令行參數等),但它們不包含業務邏輯。我的業務類實現業務邏輯,但不要假定存在或不存在任何特定於上下文的元素。這樣,如果我最初將系統構建爲控制檯應用程序,我稍後可以編寫一套windows-service引導程序/提供程序,並很快將其轉換爲Windows服務,對業務類別的影響極小或無影響。

與bootstrap/provider類相似,我也嘗試將我的數據層與業務類隔離。但這是每個人都聽過1000次的常見基本分離,所以它甚至不值一提。

許多系統的業務邏輯太複雜,不適合單個項目並保持一定程度的代碼可維護性。因此,我通常會發現自己有多個業務邏輯項目,按功能區域(「客戶管理」,「產品庫存」等)進行分組。

+0

我也有一個utils文件夾,而不是一個項目。我在那裏有班級圖表,可重複的班級等。好的建議! – 2010-07-17 04:21:49

3

我去這樣的事情在項目方面的解決方案中:

管理 - 通用文檔,許可證的主副本,等我通常會也讓這款編譯成一個小的命令行「的自述「顯示許可證,修訂說明等的應用程序

數據 - 常規數據,如XML等。無可編譯的代碼。 LibraryN - 一個或多個庫(通常爲1-3:utils,core,擴展代碼)。

Application1 ... ApplicationN - 應用程序(通常爲一個)。

Test1 ... TestN - 測試。

在每個項目中,我將每個名稱空間的文件保存在單獨的文件夾中,子文件夾中的子名稱空間等。我保留常見類型的內容,如文檔,庫或應用程序特定的數據,無論項目如何,都在具有相同名稱的子文件夾中。

-Neil

1

如果你正在做一個UI業務十歲上下的應用程序,你應該看看MVC

當然,MVC只是一個普遍的概念,但它可以幫助您做出現在正在面臨的那種決策。

WPF的MVC上有很多資源,您可能也可以直接將其應用於WinForms。

相關問題