2012-08-11 74 views
2

我剛剛開始學習WCF,並且我來自非Web背景。阻止WCF暴露我的整個類?

我已經構建了一個3層的桌面應用程序,它編譯成一個exe,它在本地運行。

現在我想將整個業務邏輯層移到一箇中心服務器,並使GUI成爲客戶端應用程序。

據我所知,WCF應該是我的解決方案,事實上,它幫助我實現了我想要的。

我負責運行遠程功能,這是我需要的基本功能。

我現在的問題是,我不太瞭解架構

例如,我的一個服務從我的Business Logics層返回數據類型(類)。

該類通過WCF機制自動變爲可用於客戶端。

但問題是,這個類包含一些方法,我絕對不想暴露給客戶端。

例如一個保存方法(保存到數據庫)。

此外,有時我甚至不想讓客戶端更改該類的所有屬性,因爲此類可能會發送到我的一個服務。

我不想重新驗證服務中的類實例。

我應該怎麼辦?我應該建立另一個層次,我公開給客戶的業務邏輯的受限版本嗎?還是有什麼辦法只暴露我的課程的一部分到客戶端,而不會限制它自己的服務器?

我知道這是一個基本問題,但老實說,我在這裏問了很多之前已經搜索過很多東西。我的問題是我不知道要搜索什麼。

我的第二個問題是,你有任何建議可以解釋我這個架構的任何資源......?

+1

我想你會更好地提取抽象的數據傳輸對象層。這是一個更靈活的方法,如果您需要切換wcf,則更便於攜帶。 – Candide 2012-08-11 14:21:31

回答

8

通常,如果你想封裝你的業務層,你不想直接公開業務對象。這是因爲您現在有一個解耦的客戶端,並且您不一定希望每次業務邏輯/屬性更改時都必須更新客戶端。

這是Data Transfer Objects (DTO)很好地發揮作用。通常,您想要控制您公開的合約(數據和方法)。因此,您可以明確製作組成傳輸層的其他對象(DTO)。然後,您可以獨立安全地更改您的客戶端和服務器代碼(只要兩者仍然滿足合同對象)。

這通常需要多一點映射(在每邊發送或接收之前),但通常是值得的。

對於WCF,標有[ServiceContract]的接口和類和標有[DataContract]的類通常組成此傳輸層。

+0

但[DataContract]是什麼意思?我的類無論如何都暴露了.. – Letterman 2012-08-11 18:51:47

+0

'[DataContract]'是告訴WCF如何爲暴露的方法參數序列化/反序列化的方式。查看更多[here](http://msdn.microsoft.com/en-us/library/ms733127.aspx)。 – 2012-08-11 22:13:46

0

但問題是,這個類包含一些方法,我絕對不想公開給客戶端。

你能提供你的類和接口代碼的例子嗎?如果是這樣,我相信你可能會得到更具體的答案。

例如一個保存方法(保存到數據庫)。

一種可能的方法是將你的班級分爲兩類。定義第一個類中的屬性,然後將該類用作第二個類的基類。然後使用第二個類來定義方法。這將允許您只返回屬性,同時允許您保持代碼乾爽。

此外,有時我甚至不想讓客戶端更改該類的所有屬性,因爲此類可能會發送到我的一個服務。 我不想重新驗證服務中的類實例。

雖然你可以在get定義邏輯,並設置每個屬性的方法我會強烈建議重新驗證服務之間收到任何輸入簡單,因爲任何未來服務於一體的變化或錯誤,可能會導致在更大的問題,你的應用。此外,這也有助於確保您的應用程序對任何潛在攻擊都更加安全。

我應該建立另一層,業務邏輯的受限版本,我公開給客戶端?還是有什麼辦法只暴露我的課程的一部分到客戶端,而不會限制它自己的服務器?

我同意上面的答案,你應該能夠限制訪問不同的屬性和方法使用接口中的數據和方法屬性。

我的第二個問題是,那麼你有任何建議可以解釋我這個架構的任何資源......?

如果您正在尋找價格便宜,但非常有價值的基於視頻的訓練我發現Pluralsight提供是兩個建築,以及WFC服務(順便說一句,我沒有與他們有聯繫相當不錯的課程,只是享受他們的訓練)。