У меня небольшая проблема с пониманием ServiceKnownType в WCF.
Взято из этого блога , следующий код не работает:
[DataContract(Namespace = “http://mycompany.com/”)]
public class Shape{…}
[DataContract(Namespace = “http://mycompany.com/”)]
public class Circle : Shape {…}
[ServiceContract]
public interface IMyServer
{
[OperationContract]
bool AddShape(Shape shape);
}
.
IMyServer client = new ChannelFactory<IMyServer>(binding, endPoint).CreateChannel();
client.AddShape(new Circle());
Причина, по которой это не работает, заключается в том, что вы пытаетесь добавить круг, но сервисный контракт допускает только форму. Предполагается, что вы делаете что-то с ноу-типами, но я немного озадачен тем, как это работает.
Поскольку этот код находится в сервисе, почему он не знает автоматически, что Circle получен из Shape? Кроме того, что на самом деле делает ServiceKnownType?
Когда ServiceKnownType ставится ниже DataContract, очевидно, это заставляет его работать. Я предполагаю, что это говорит, эй, этот конкретный тип объекта, называемый Shape, также может быть Кругом. У меня возникают проблемы с пониманием того, почему это происходит именно так, потому что, если вы добавите новый тип, такой как Square, вам придется добавить в класс Shape ServiceKnownType для него. Разве не имеет смысла выводить KnownType на квадрат, а не на форму, если он не может это сделать? Итак, Квадрат говорит: «Эй, я Шейп, а тебе не нужно возиться с классом Шейп? Если ваш класс Shape встроен в библиотеку, и вы хотите создать свою собственную фигурную форму, такую как DiamondShape, вы не можете добавить ее в класс Shape, потому что у вас нет доступа к исходному коду.