2012-02-29 29 views
1

我剛剛使用WCF/REST Web服務使用Entity Framework訪問數據庫,應用一些次要業務邏輯並將結果傳遞給.NET Webforms前端,從而得到了一個小項目。這很奏效,但最初的設計卻沒有很多時間來調查選項,現在我被要求做另一個非常類似的項目。現在我有更多的時間去看看那裏有什麼,並且可能比第一個項目做得更好。WCF/REST Web服務,實體框架和WebForms前端之間的接口選項:我的選項是什麼?

我想知道是否有更好的方法來完成一些事情,特別是在Web服務和前端之間來回傳遞對象。

對於第一個項目,我創建了一個包含Web服務和網站使用的類定義的共享庫。當請求進入Web服務時,執行了數據庫查詢,應用了業務邏輯,並創建了其中一個共享類型的對象,並將其傳回到Web服務響應中。

當網站得到響應時,它將其反序列化到適當的共享對象並繼續其快樂的方式。

它工作正常,但有很多代碼必須寫入來定義共享對象,然後將查詢結果/業務邏輯結果映射到共享對象。

有沒有更好的方法?具體而言,我正在尋找的方法是:

  • 自動生成對象。 (我不確定是否有 - 我似乎可以自動生成專門映射到數據庫實體(如表或視圖)的對象(事實上,這就是實體框架所做的),但是需要包含非數據庫信息的對象又如何像商業邏輯可能添加的東西?)

  • 刪除Web服務和網站之間共享庫的需求。我懷疑這可能存在,但我甚至不知道從哪裏開始。

回答

2

我正在做一個類似的項目,這裏是我正在做的事情(你可以決定它是否適用於你)。

  • 查看使用UIModel
  • 當一個函數被調用時,我通過我的UIModel到了UIModel映射到ServiceModel
  • 的的ServiceManager發送ServiceModel到服務(我用RestSharp到的ServiceManager削減映射代碼)
  • 我的服務接收ServiceModel並立即將其映射到一個商業模式(我用ServiceStack來,再次削減映射代碼)
    • 服務的唯一工作就是拆禮物服務對象並適當的路線。這隱藏了我實際業務層的內部細節。如果不是對你很重要,那麼你的商業模式可能是一樣的,你ServiceModel(以及可能與您的數據庫模型)
  • 我的服務發送的商業模式的BusinessManager,這是否有任何業務邏輯和然後創建一個PersistenceModel傳遞到被保留的
  • 然後,整個過程正好相反

所以,我結束了4個車型RepositoryManager總結如下:

  • UI有自己的模型
  • ServiceManager和Service共享一個模型(這也是ServiceManager的要點;以分離UI的從服務的關注)
  • 商業邏輯有其自己的模型
  • 持久性邏輯有其自己的模型

此,如已經如上所述,允許關注點分離。我可以改變我的持久性模型,而不需要改變我在服務中設置的合約(這將是公開的)。這樣做會使內部更改不會中斷外部應用程序。儘管如此,您仍然有可能需要更換所有型號。

至於將它們映射到一起的樣板,我使用AutoMapper。因此,由於AutoMapper,RestSharp和ServiceStack的原因,代碼不會混淆映射。該代碼看起來像代碼:)

我不確定這是否完全回答你的問題,但它聽起來有點像你正在解釋。

UPDATE:

這是試圖走在上面,使之更加具體的BDW的ASP.NET解決方案:

  • 創建一個單獨的項目,將只存儲您UIModels。
  • 引用在您的asp.net項目中,並期望將其用於任何asp.net邏輯
  • 創建一個單獨的項目,將只存儲您的ServiceModels。
  • 每當你需要調用的服務,從您的UIModel將數據轉換到你的ServiceModel
    • 這可以在asp.net項目內進行。或者,您可以創建一個新的項目,將採用UI模型併爲您進行轉換和服務調用(這樣,您的服務模型不必在asp.net部分中引用)
  • 創建另一個項目將調用爲您服務,使用ServiceModel
  • 現在,你在你的服務,並根據您的意見,您可以處理剩下的
+0

聽起來你使用MVC?不確定映射到我正在做什麼 - 對於這個項目,我使用的是.NET WebForms,這不是可以在這一點上改變的東西。 – BDW 2012-02-29 22:00:04

+0

實際上它應該沒關係。唯一的區別是注入你的依賴關係(管理者)會更加困難。否則,我的想法只是基於用戶界面,服務,業務和持久性的概念。是的,MVC和關注點的分離使得這個更清晰,但同樣沒有必要。一旦你將你的模型傳遞給servicemanager,它就完全一樣。 – 2012-03-01 01:41:10

+1

好奇你爲什麼使用RestSharp而不是ServiceStack的內置ServiceClients?似乎你會節省更多的樣板嗎? – mythz 2012-03-01 08:13:29