.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(尽管实际的映射可以自动化)。
答案 0 :(得分:0)
是的,这可以很快证明。 Web服务可以接受不可变的字符串,因此Web服务可以接受不可变数据。
你问的问题似乎是一个稍微不同的问题。 Web服务序列化机制(XML序列化)是否可以处理不可变对象。一般来说不可能,因为XML序列化严重依赖于不可变对象上不存在的读/写属性。
通常当我遇到这种情况时,我会创建2个对象。
答案 1 :(得分:0)
好吧,似乎除了将可变DTO用于SOAP之外没有办法,所以我们使用DTO和AutoMapper自动转换不可变对象。