2010-10-19 50 views
0

首先,我是WCF世界的新手,所以如果這聽起來很天真,請原諒我。wcf服務可以鬆散地解耦

據我瞭解,與基於ASP.NET網站,其使用ADO.NET傳達給數據庫,基於Silverlight的應用程序總是需要一個WCF RIA或服務進行通信,以DB。我們知道ASP.NET網站與數據庫模型沒有緊密耦合,因此可以使用ADO.NET運行任何存儲過程,並在網格中查看結果,而不必瞭解生成的對象模型。

然而,在WCF RIA或服務,你必須總是有它與數據庫實體模型同步,並沒有在服務中的結果模式不能運行任何存儲過程。因此,Silverlight在某種程度上迫使我們與數據庫模型緊密結合。

有什麼辦法,我可以查看在網格上不管PROC得到在後端改變的次數的存儲過程的結果?

回答

2

然而,在WCF RIA或服務,你必須總是有它與數據庫實體模型同步,並沒有在服務中的結果模式不能運行任何存儲過程。因此,Silverlight在某種程度上迫使我們與數據庫模型緊密結合。

Bzzzzt!錯誤的答案!!

WCF服務沒有被緊緊地連接到數據庫的。事實上,有一個WCF服務,你仍然可以實現n層的方法:

WCF end point -> calls through to business layer -> calls DAL -> calls database 

WCF服務的好處是,它可以用於業務層面臨各種斷開鬆散耦合的客戶(或消費者 - 他們不必是UI客戶端)。所有暴露的內容都是作爲一個接口完成的 - WCF服務提供了一個它能保證滿足的合同。通過該接口返回的數據對象可以是我喜歡的任何東西(只要它可以在WCF邊界上序列化)。它不一定是反映我數據庫結構的DataTable或數據對象。

我不能RIA服務發表評論,但因爲我沒有跟他們玩。我的理解是,他們只是爲了方便而爲您生成的一堆東西的WCF服務,這意味着它們可能非常類似於您的數據庫結構。這樣做的方法是多花點時間創建自己的WCF服務。其它應答者可能能夠更詳細地說明,雖然:)

編輯:看來,實際的問題是,您數據檢索機制是什麼是緊耦合。可以有多種方式來解決這個隔離出來進行更改的影響(請注意,這不是一個詳盡的列表):

  • 確保您的WCF調用的返回類型的對象 - 甚至與緊耦合數據庫中的對象類型保持不變,儘管其內部可以改變(即如果添加另一個屬性),因此,你應該添加另一列到你的數據庫表的時候需要不改變WCF接口

  • 創建一個單獨的程序集,用於從數據庫中實現數據檢索。這將成爲您的DAL(d ATA 一個 CCESS 大號艾爾),把你的LinqToSql的東西在裏面,這防止它實現了WCF的組件分離端點

  • 翻譯是從返回的數據將數據庫轉換爲更加通用且不可知的輕量級數據對象,然後再通過WCF邊界(數據傳輸對象-DTO)

  • 使用代碼生成工具(有很多)根據您的數據對象生成您的WCF接口定義

+0

是的,我知道WCF提供了一個合約,並且數據對象被序列化以供客戶端使用。在我的應用程序中,我有一個可以調用存儲過程的linq sql類,而IResult是由設計器自動生成的。只要存儲過程沒有改變,這個工作就會生效,但是一旦我添加或刪除一個列形成結果,我將不得不更新服務。我想知道是否可以通過提供存儲的proc名稱以及參數來對數據庫進行泛型調用(即,像在ADO.NET中使用SqlCommand,CommandType = sp和SqlReader一樣) – Hari 2010-10-19 22:15:36

+2

WCF中絕對沒有任何東西阻止您使用普通的ADO.NET作爲你的數據庫層。您只需使用您手動編寫的POCO(Plain Old CLR對象),而不是L2S或EF爲您生成的類。 – 2010-10-19 22:48:24

+0

@哈里 - 我已經編輯了我的答案以迴應你的評論 – slugster 2010-10-19 22:53:04