2010-09-20 87 views
0

我有一個服務方法,它將提供一些參數,這些參數將隨着參數的名稱和數量而改變(我將知道ACTION字段所期望的參數)關於Web服務和WCF的設計問題

爲了解決像上面這樣的設計問題,我創建了一個Web服務,它的參數將始終提供,還有一個參數可以接受用密鑰< *>值編寫的字符串。

使用MyServiceMethod:

Action : Action1 
Param2: Hello 
param3: world 
Additional_Params: name<*>Jack;address<*>2 street; 

(我知道,有措施1我從誰使用該服務的人員姓名和地址值)使用MyServiceMethod第二次

Action : Action5 
Param2: Hello 
param3: world 
Additional_Params: numOfHours<*>3;Sum<*>342;myName<*>asaf; 

我認爲這不是針對每個ACTION接受不同數據的Web服務的最佳設計,有沒有更好的方法來實現這一點?

+0

有多少種不同的操作,它們多久更換一次? – 2010-09-20 20:40:16

+0

並不是很多行爲,並非如此。 – Rodniko 2010-09-21 14:26:32

+0

謝謝,我寫了一個答案。 – 2010-09-21 16:55:23

回答

0

我那種已經在評論回答,但在這裏它是在一個地方:

如果你有一個小許多不同的功能,而很少改變,最好的辦法就是揭露每一個單獨的功能。當需要新的代碼時,你可以擴展你的接口而不破壞現有的代碼。另一方面,如果你有更多的功能和/或他們經常變化,那麼簡單但靈活的界面會更好。您可以公開一個單一的函數,並將XML文檔作爲請求DTO的序列化。這將需要一些demux邏輯(switch/case或者更好的是,代表查找表)將請求分派給處理程序。這種方法很難實現,但更容易維護。

2

如果您有一小組操作,那麼對每個操作使用單一方法可能是最好的設計策略。這可能不需要太多的工作來挑選後端,在我看來,這並不令人感到羞恥。

如果你有一個大組動作,你可以代表你想要做一個數據結構是什麼,以及只傳遞該參數。

我不會說你的方式無論如何,提出這樣做​​是錯誤的,但實際上最終可能會爲你創造更多的工作,並在以後讓你或其他開發者感到困惑。

+0

問題不僅僅是這個集合有多大,而且還有多變。如果它永遠不會改變,那麼即使有大量的功能也可以。 – 2010-09-20 20:54:42

2

我不是你想做什麼100%清楚,但如果你知道Action1將始終以「名」和「地址」的名稱/值對被調用,Action5將被稱爲與「numOfHours」,「Sum」和「myName」,然後我同意@Eugarps答案和@Steven_Sudit相關評論。只需將它們作爲每個操作的方法參數。

但是,如果你不知道什麼是變量參數將要(只調用的操作時,你會得到一定的名稱/值對),那麼我會至少使用一個IDictionary<string, object>而不是字符串。這樣做意味着您可以避免解析字符串值。如果傳遞的值是你自己類型的實例(而不是原語),那麼你還需要使用ServiceKnownType屬性來告訴序列化程序。

+0

另一種方法是將接口更改爲接受XML文檔,該文檔本身可能是DTO的序列化。 – 2010-09-21 12:01:53

+0

我認爲一個XML解決方案會導致一大塊代碼來驗證XML結構(xsd)並分析XML ....我不知道.... – Rodniko 2010-09-21 14:27:48

+0

我可以在GET url中傳遞IDictionary嗎? – Rodniko 2010-09-21 14:58:01