2010-09-09 69 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而不是客户端。