代码之家  ›  专栏  ›  技术社区  ›  vgru

接受不可变对象的Web服务

  •  2
  • vgru  · 技术社区  · 15 年前

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

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

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

    StatusData 包含不可变属性,服务器将抛出 System.Web.Services.Protocols.SoapException 调用方法时:

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

    [编辑]

    显然,我不是在说弦,因为 string 例外 XmlSerializer 不会工作(没有明确的 IXmlSerializable 对于任何其他不可变类。

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

    2 回复  |  直到 15 年前
        1
  •  0
  •   JaredPar    15 年前

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

    不过,你问的问题似乎有点不同。web服务序列化机制(XML序列化)能否处理不可变对象。一般来说,这是不可能的,因为XML序列化在很大程度上基于不可变对象上不存在的读/写属性。

    1. 我的对象的可变版本,可以很容易地在不可变版本之间进行转换,并且可以在序列化等情况下使用。
        2
  •  0
  •   vgru    14 年前

    好吧,似乎除了对SOAP使用可变dto之外没有其他方法,所以我们使用dto和 AutoMapper 自动从不可变对象转换。