Web服务接受不可变对象

时间:2010-06-04 15:39:54

标签: .net web-services immutability

.NET Web服务是否可以在Web方法中接受不可变对象(或包含对不可变对象的引用的对象)?

例如,如果这是我的Web服务方法:

public class MyWebService : System.Web.Services.WebService
{
    [WebMethod]
    public void SetStatus(StatusData data)
    {
        // do something
    }
}

StatusData包含一个不可变属性,当调用方法时,Server将抛出System.Web.Services.Protocols.SoapException

无法生成临时类(结果= 1)。
错误CS0200:无法将属性或索引器“TestProject.Entities.StatusData.Id”分配给 - 它是只读的

我是否仍能以某种方式使用不可变对象,或者是将所有内容映射到可变DTO中的唯一方法?

[编辑]

显然,我不是在谈论字符串,因为string是.Net中的基类型,并且对于此问题实际上是异常。例如,对于任何其他不可变类,XmlSerializer将不起作用(没有明确的IXmlSerializable实现)。

但是我希望我能避免手动编写一堆可变DTO(尽管实际的映射可以自动化)。

2 个答案:

答案 0 :(得分:0)

是的,这可以很快证明。 Web服务可以接受不可变的字符串,因此Web服务可以接受不可变数据。

你问的问题似乎是一个稍微不同的问题。 Web服务序列化机制(XML序列化)是否可以处理不可变对象。一般来说不可能,因为XML序列化严重依赖于不可变对象上不存在的读/写属性。

通常当我遇到这种情况时,我会创建2个对象。

  1. 我在大多数情况下使用的普通不可变对象
  2. 我的对象的可变版本,可以很容易地转换为不可变版本,并在序列化等情况下使用。

答案 1 :(得分:0)

好吧,似乎除了将可变DTO用于SOAP之外没有办法,所以我们使用DTO和AutoMapper自动转换不可变对象。

相关问题