如何阻止通过Web服务公开的setter?

时间:2010-09-09 05:30:16

标签: c# .net web-services

我想要一个这样的课程,

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添加服务引用时,我获得了为我生成的客户端代理对象,允许我在客户端创建Apple并将其发送到Web服务。

有没有办法让我只在客户端读取其中一个属性?我需要那里的setter,以便我可以在服务器端设置值,但我想控制他们可以在客户端更新哪些数据。

有什么想法吗?

我能做的是传递构造函数中的一些数据,并且只在我想要读取的数据上公开getter,但我想在服务器端使用对象映射器。这意味着理想情况下我想留下那些塞特尔。

3 个答案:

答案 0 :(得分:3)

通常,您无法控制在客户端生成的代理。因此,正确的方法是忽略客户端发送的值(如果他更改了这些值,则引发异常)。必须明确提及服务文档。

修改的: 另一种解决方法是将您的数据类划分为两个类 - 一个是客户端不可编辑的(比如说Apple1),另一个是可编辑的 - 比如说Apple2。所以现在服务更新方法只能接受Apple2,以便客户端可以知道查看生成的代理代码他可以更改的内容。在服务器端,您可以让从Apple2继承的Apple1拥有完整的数据,但我相信在客户端生成的代理无论如何都会有两个不同的无关类。在这种情况下,更好的方法可能是使用包含Apple1和Apple2的复合完整AppleFull。

答案 1 :(得分:1)

请参阅以下问题及其答案,我只是略过了你的问题,但我相信这是我面临的类似问题 -

WCF serialization and Value object pattern in Domain Driven Design

答案 2 :(得分:0)

实现这一目标的另一种方法是在服务器和客户端之间共享包含Apple类(但没有服务器端组件)的程序集。使内置setter并使用InternalsVisibleTo属性将服务器端程序集标记为朋友。

这将允许服务器使用setter而不是客户端。