Обеспечение устойчивости десериализатора WCF к изменениям
Предположим, у меня есть веб-приложение C# и служба CF 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/(whatever 2)" не ожидается. Ожидается элемент '_whwhat3'.'
Я сделал все, что мог придумать, чтобы избежать этой ситуации. Я удалил ряд зависимостей от сложных объектов, но некоторые (например, Customer) настолько важны, что их трудно полностью исключить из коммуникации WCF. Я пытался заблокировать свойства от сериализации, но WCF делает это в любом случае.
Что можно сделать, чтобы сделать службу WCF более терпимой к возможным дополнительным свойствам, представленным веб-приложением? Я могу изменить как службу, так и веб-приложение, при условии, что изменение службы минимизирует будущие перераспределения.
1 ответ
Используйте объекты передачи данных (DTO). Эти классы должны принадлежать службе и изменяться только в случае обновления службы. Сопоставьте бизнес-объекты, объекты, модели и т. Д. С вашими DTO, используя что-то вроде AutoMapper.
Слои разделения (и убедитесь, что слои не перетекают друг в друга), позволят вам вносить изменения, подобные описанным вами, без воздействия на другие слои.