Делаем десериализатор WCF устойчивым к изменениям

Предположим, у меня есть веб-приложение C# и служба C# WCF, плавающая где-то там. Они работают по такому контракту:

[ServiceContract]
public interface IRemoteDeliveryService
{
    [OperationContract]
    Customer GetCustomer();
}

...с Заказчиком:

[Serializable]
public class Customer
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Теперь предположим, что в веб-приложение добавлена ​​функция, не относящаяся к службе WCF, но вызывающая расширение Customer.

[Serializable]
public class Customer
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int Income { get; set; } // new!
}

По опыту, если ссылка на службу и служба не обновляются немедленно, пользователи начнут получать эту ошибку до тех пор, пока служба WCF не будет нажата для отражения нового объекта: ошибка в строке 1, позиция 21175. «EndElement» «(независимо)» из пространства имен 'http://schemas.datacontract.org/2004/07/(чтоугодно 2 )' не ожидается. Ожидается элемент '_whatever3'.'

Я сделал все, что мог, чтобы избежать этой ситуации. Я удалил ряд зависимостей от сложных объектов, но некоторые из них (например, Customer) настолько важны, что их трудно полностью исключить из связи WCF. Я пытался блокировать сериализацию свойств, но WCF все равно делает это.

Что я могу сделать, чтобы сделать службу WCF более терпимой к потенциальным дополнительным свойствам, представленным веб-приложением? Я могу модифицировать и службу, и веб-приложение, если модификация службы сводит к минимуму будущие избыточные повторные развертывания.


person spamguy    schedule 23.09.2013    source источник
comment
Вы пытались использовать interface в качестве типа контракта вместо реализации Customer?   -  person mrtig    schedule 23.09.2013
comment
Мой опыт в основном заключается в использовании [DataContract] для оформления контрактов данных, при этом каждый член данных украшается [DataMember], и это, кажется, позволяет без проблем добавлять дополнения.   -  person zimdanen    schedule 23.09.2013
comment
Службы JSON очень гибки для этого (если это возможно). Сериализаторы JSON действительно сериализуют сообщение, что бы оно ни содержало.   -  person lcryder    schedule 23.09.2013


Ответы (1)


Используйте объекты передачи данных (DTO). Эти классы должны принадлежать службе и изменяться только при обновлении службы. Сопоставьте бизнес-объекты, сущности, модели и т. д. с вашими DTO, используя что-то вроде AutoMapper.

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

person cadrell0    schedule 23.09.2013
comment
Итак, чтобы вернуться к рассматриваемому примеру, я бы создал второй класс Customer со всеми нужными мне свойствами? Думаю, именно этим я и занимался (см. третий абзац снизу). Один класс состоит из десятков свойств и использует другие классы, для которых мне пришлось бы повторить процесс — я просто хотел найти более простое решение. Я посмотрю в AutoMapper. Спасибо! - person spamguy; 24.09.2013