2012-10-02 132 views
0

我只需要一些幫助來組織我的代碼。這不是哲學,而是真正的問題。我正在尋找一個可行的解決方案。例如在php和symfony框架中,如何組織代碼非常清晰。在c#.net我感覺失落。
我只是想從頭開始重寫我的項目重用一些部分。具有Web服務的.net應用程序的體系結構

說明
首先是因爲我針對許多平臺上的Windows Mobile,Windows桌面,Android,網絡似乎我應該公開的功能的Web服務,而不是與數據庫直接通信。它是否正確 ?
然後,我需要一些客戶端應用程序。一個wpf,android和windows mobile。

在wpf我想我可以使用MVVM模式。

問題
我使用PostgreSQL使用ADO.NET和相比其他同類應用中的性能是驚人的。我發現Dapper會幫助很多,並且是我一直在尋找的東西。不過,我無法把sql代碼放在哪裏。好吧,我有模型類..就像客戶,奧德等...然後,我應該把sql代碼放在哪裏?我應該把CRUD代碼放在單獨的類上嗎?目前我在控制器類中有一些代碼,但是當我想要某個東西時,我總是構造一個新的控制器類。這看起來不太好。
是否有任何模式如何組織數據庫代碼?

+1

如何組織數據庫代碼有*許多*模式。一般的做法是以一種對消費該功能的代碼有意義的方式封裝功能。除此之外,儘管如此,你的問題可能太過於開放,無法獲得簡潔的答案。 –

+0

看看[Sharp Architecture](https:// github。com/sharparchitecture/Sharp-Architecture/tree/master/NugetTemplates)瞭解如何管理ORM的一些指示。 – Nick

回答

1

您的後端部分需要提供以下functionallity:

  1. 操作與客戶:從客戶端進程請求併發送響應回客戶端。這裏的主要問題是定義請求/響應格式。例如,您可以使用SOAP或REST,.NET框架服務框架(如WCF)可以與這兩種協議協同工作,但對我而言,它更加面向SOAP。 WCF使用類來描述服務契約,所以我認爲最好使用一些實體而不是純ADO.NET。

  2. 通知客戶端有關錯誤:包括驗證錯誤和異常。驗證消息需要在客戶端上顯示,通常通過屬性名稱來處理,異常也應該被處理。還有處理與數據庫相關的錯誤並將其轉換爲域模型錯誤的問題。

  3. 基於services的WCF體系結構 - 它是通過一組協議訪問的契約及其實現。由於WCF使用實體序列化和反序列化,所以將任何業務邏輯放入實體並不是一個好主意。把它放到單獨的類(repositories)並從您的服務調用存儲庫。它被稱爲anemic domain model - 域實體不包含任何業務邏輯 - 與rich domain model相反 - 實體包含業務邏輯。

  4. 對數據庫的訪問通常被封裝爲一組稱爲數據訪問層(或DAL)的類。 DAL提供了一組持久化實體到數據庫或從數據庫加載實體所需的方法。此方法不應包含業務邏輯,但會封裝來自業務邏輯層的數據庫詳細信息和結構。要實現常用的圖層幫助器工具:像ORM(實體框架,BLToolkit等)。

  5. 業務邏輯層(BLL) - 使用來自DAL的方法來存留實體。它不應該直接與數據庫一起工作 - 只需調用DAL中的方法即可。業務邏輯包含實體和實體集所有操作 - 包括驗證,計算,權限檢查等

編輯

支持您可以使用從數據庫類脫鉤像TransactionScope或事務支持交易內置於ORM。

業務邏輯相對不依賴於DAL操作總是好的 - 即業務層流程實體不知道實體將被保存。如果可能的話,你可以在DAL中封裝數據庫事務 - 但是這可能必須讓你有很多參數的醜陋的方法,並通過許多實體和集合來保存內部事務。

但通常這是不可能的,業務邏輯層方法幾次調用DAL操作 - 加載和保存其他實體。在這種情況下,交易範圍或它的ORM類似物是一個不錯的選擇。

+0

好吧,例如我想要下一個新的訂單。 Web服務placeOrder被調用。那麼應該調用什麼? BLL或存儲庫?一些業務邏輯,如數據庫事務應該放在哪裏?我的意思是一些併發和驗證檢查應該在一個事務處理中完成,並且這隻能在DAL中完成,但是你說那裏沒有業務邏輯.. – GorillaApe

+0

它應該調用業務邏輯。業務邏輯必須驗證訂單,支票金額,計算稅金等,並使用DAL將其保存到數據庫。 我編輯了我的答案,因爲評論無法格式化得很好 – STO

1

您可能想要考慮使用業務邏輯層,數據訪問層和用戶界面的N層應用程序。更多細節:http://en.wikipedia.org/wiki/Multitier_architecture

我會這樣做,並通過DAL(數據訪問層)訪問我所有的存儲過程或SQL代碼(或LINQ-To/EF)。

但是,如果您使用的是Web服務(我想您只有UI和BL層),這可能不是必需的 - 只需調用Web服務並執行您需要的結果。

所以,你的應用程序將只是UI和BL。 BL調用Web服務(以相同的方式調用DAL,如果有的話),檢索數據並執行它需要做的事情。

只有在BL處理請求/響應並傳遞給DAL以將數據傳回應用程序時,您的webservice纔會成爲BL和DAL。

1

我應該在哪裏把SQL代碼,我應該把CRUD代碼在 單獨的類?

是的,看看Repository pattern - 你的數據代碼應該是分開的,並返回對象,如CustomerEntity FrameworkNHibernate可以提供合適的功能並且是行業標準。

你也可以把一個Service Layer放在那個,它從你的多個前端被調用。

請確保您在圖層之間使用了DI以減少緊密耦合,現在我喜歡StructureMap,但有許多好的框架。

順便說一下,您還可以在MVC中使用MVVM模式。

+0

開箱即用.net支持依賴注入? – GorillaApe

+0

您可以使用Ninject,StructureMap或Microsoft的Unity等DI框架。 .NET本身沒有一個部分。 –

相關問題