Почему мои рабочие контракты в моем клиенте wcf не принимают интерфейсы в качестве параметров?
У меня есть простой сервисный контракт wcf, который отлично работает, если я использую конкретные реализации для интерфейсов, но если я хочу использовать интерфейсы в параметрах вместо конкретных классов, это дает мне ошибку, которую я покажу ниже.
Вот код:
[ServiceContract]
public interface IClientUserRegistration
{
[OperationContract]
void RegisterClientUser(ClientUser clientUser);
[OperationContract]
List<ClientUser> GetUsers();
}
Если я заменю ClientUser на IClientUser, тестовый клиент WCF скажет, что операция RegisterClientUser не поддерживается, поскольку он использует тип System.Object. Если я заменяю возвращаемое значение GetUsers на List, это говорит о том, что эта операция не поддерживается, потому что она использует тип System.Object[]. Почему это дает эти ошибки?
Причина, по которой я пытался использовать IClientUser, заключается в том, что я мог реализовать различные типы пользователей, которые реализуют интерфейс IClientUser, и передать их в RegisterClient, но если я могу только передать ClientUser, то мне нужно создать группу переопределений RegisterClient, которые принимают разные типы пользователей.
2 ответа
SOAP не имеет понятия интерфейсов. Это может затруднить десериализацию.
Это потому, что объекты должны быть сериализованы для передачи между клиентом и сервером. Вам не разрешено передавать тип "объект". Все типы должны быть конкретными, чтобы их можно было правильно сериализовать и десериализовать. Интерфейс - это не что иное, как объектный тип с подтипом интерфейса. Таким образом, объект в целом не может быть десериализован и сериализован, могут быть только члены интерфейса. Это сделало бы действительно грязную реализацию с обеих сторон.