Веб-сервис, принимающий неизменный объект - PullRequest
2 голосов
/ 04 июня 2010

Возможно ли для веб-службы .NET принимать неизменяемый объект (или объект, содержащий ссылки на неизменяемые объекты) в веб-методе?

Например, если это мой метод веб-сервиса:

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' нельзя назначить - оно доступно только для чтения

Могу ли я по-прежнему использовать неизменяемые объекты или это единственный способ сделать это для преобразования всего в изменяемые DTO?

[Изменить]

Очевидно, я не говорю о строках, поскольку string является базовым типом в .Net и действительно является исключением для этой проблемы. Например, XmlSerializer не будет работать (без явной реализации IXmlSerializable) для любого другого неизменяемого класса.

Но я надеялся, что смогу избежать написания вручную нескольких изменяемых DTO (хотя само отображение можно автоматизировать).

Ответы [ 2 ]

0 голосов
/ 06 июля 2010

Что ж, похоже, нет другого пути, кроме как использовать изменяемые DTO для SOAP, поэтому мы использовали DTO и AutoMapper для автоматического преобразования из неизменяемых объектов.

0 голосов
/ 04 июня 2010

Да, и это можно быстро продемонстрировать. Веб-сервисы могут принимать строки, которые являются неизменяемыми, поэтому веб-сервисы могут принимать неизменяемые данные.

То, что вы спрашиваете, похоже, немного другой вопрос. Может ли механизм сериализации веб-службы (сериализация XML) обрабатывать неизменный объект. Вообще говоря, нет, это невозможно, поскольку сериализация XML в значительной степени основана на свойствах чтения / записи, которых нет в неизменяемом объекте.

Обычно, когда я сталкиваюсь с такой ситуацией, я создаю 2 объекта.

  1. Мой обычный неизменный объект для использования в большинстве случаев
  2. Изменяемая версия моего объекта, которую можно легко преобразовать в неизменяемую версию и из нее и использовать в таких ситуациях, как сериализация.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...