2010-09-09 72 views
3

我希望有一個這樣的類,如何阻止通過Web服務暴露的setter?

public class Apple 
{ 
    public string Size { get; set;} 
    public string Colour { get; set;} 
    public string Shape { get; set;} 
    public int appleId { get; set;} 
} 

我想要使用一些Web方法這樣通過web服務揭露,

public void AddApple(Apple apple) 
{ 
} 

public Apple GetApple(int appleId) 
{ 
} 

所以,當我添加在Visual Studio中的服務引用到那個webservice我得到客戶代理對象爲我生成允許我在客戶端創建一個蘋果,併發送到web服務。

有沒有辦法讓我在客戶端只能讀取其中一個屬性?我需要那些設置器,以便我可以在服務器端設置值,但是我想控制在客戶端可以更新哪些數據。

任何想法?

我可以做的是在構造函數中傳入一些數據,並且只將暴露的getter放在我想要讀取的數據上,但我想在服務器端使用對象映射器。這意味着理想的情況下,我想讓那些定居者離開那裏。

回答

3

通常,您不能控制客戶端生成的代理。所以正確的方法是忽略客戶端發送的值(或者如果他更改這些值,則會引發異常)。服務文檔必須明確提及這樣的事情。

編輯: 另一種變通方法。將您的數據類分爲兩大類 - 一個不可編輯的客戶端(比如Apple1),另一個編輯 - 說Apple2。因此,現在服務更新方法只能接受Apple2,以便客戶可以知道查看生成的代理代碼他可以更改哪些內容。在服務器端,你可以從Apple2繼承Apple1以獲得完整的數據,但我相信在客戶端生成的代理將可以/無論如何擁有兩個不相關的無關類。也許在這種情況下更好的方法是使用包含Apple1和Apple2的合成完整AppleFull。

+1

實現這一點的另一種方式是有兩班。其中一個將從「getter」方法返回並具有所有屬性。另一個將被「setter」或「adder」方法接受,並且只有客戶端可以明確設置的那些屬性。 – qbeuek 2010-09-09 05:47:53

+0

@qbeuek,你是對的!當您的評論彈出時,我正在編輯我的答案(表明類似的解決方案)。答案現在被編輯以包含相同的內容。 – VinayC 2010-09-09 06:00:13

0

實現這一目標的另一種方法是在服務器和客戶端之間共享包含Apple類(但不包含服務器端組件)的程序集。使用InternalsVisibleTo屬性將setter放在內部,並將服務器端組件標記爲朋友。

這將允許服務器使用setter而不是客戶端。