Интерфейс возврата контракта WCF может вызвать проблему сериализации?
Я пытаюсь определить контракт WCF, который возвращает интерфейс, что-то вроде ниже:
[ServiceContract]
public interface IMyContracts
{
[OperationContract]
IMyInterface GetData(string request);
}
Чтобы заставить это работать, я думаю, что мой интерфейс (IMyInterface
) придется реализовать ISerializable
чтобы классы, реализующие мой интерфейс, могли быть сериализованы. Это значит, что я должен вручную реализовать сериализацию для любых классов, реализующих мой интерфейс.
Кажется, что либо я использую свой интерфейс и рискую ошибки времени выполнения, если используется класс, который не сериализуем, или я заставляю интерфейс реализовать ISerializable
и иметь связанные с этим трудности ручной реализации.
Я смущаюсь и упускаю что-то очевидное? Как другие люди возвращали интерфейсы, используя WCF, и избегали этой проблемы?
Спасибо большое.
2 ответа
AFAIK, проблема не в сериализации, а в том, что вы возвращаете абстрактную сущность (интерфейс). Абстракция - это концепция ОО, а не концепция SOA. Таким образом, стек wcf вашего клиента может не знать, что делать с классом за интерфейсом. Что делать, если клиент не знает класс позади интерфейса. Стек WCF клиента должен десериализовать его, и для этого он должен знать класс.
Таким образом, вы должны сделать класс (ы) за частью интерфейса вашего контракта через KnownTypeAttribute.
Вы также можете использовать класс ServiceKnownTypeAttribute, который кажется более гибким. Тем не менее, помните, что клиент должен знать тип, или вы получите исключение.
В этой статье я подробно расскажу, как заставить WCF работать для получения и возврата производных классов и интерфейсов.