Как * правильно * использовать типы интерфейса с WCF? - PullRequest
3 голосов
/ 29 мая 2011

Более конкретно, вопрос заключается в следующем: Как сериализовать класс с WCF, который имеет (должен иметь) типы интерфейсов в сигнатурах свойств, поскольку он реализует интерфейс?

Это вопрос дизайна. Я не ищу взломать. Цель состоит в том, чтобы отделить определения интерфейсов от реализующих классов и, следовательно, не позволить интерфейсам ссылаться на реализующие классы.

Я знаю, что мы не должны передавать интерфейсы с WCF и также, что есть еще (не совместимые) способы сделать это (например, с помощью NetDataContractSerializer или атрибута ServiceKnownType), но это оставляет меня с вопросом: есть ли правильный способ использовать классы, основанные на интерфейсах с WCF, или это не должно быть пытался вообще?

Ответы [ 2 ]

4 голосов
/ 29 мая 2011

Сериализация в основном связана с передачей данных .Интерфейсы предназначены для описания поведения .По сути, эти две вещи полностью ортогональны, ИМО.

Вы можете возможно заставить его работать с [KnownType(...)] - и это, безусловно, поможет, если вы будете использовать одни и те же точные типы на каждом конце (совместное использование сборок), но это очень непереносимо.

Если вы стремитесь к идиоматическому использованию WCF для переносимости , вам, вероятно, следует ограничиться простыми контрактами на передачу данных, которые имеют шансбыть полезным для клиентов, которые знают только WSDL.

Тем не менее, у меня нет никаких сомнений в том, что я пытаюсь и злоупотребляю WCF в своих собственных целях, когда мне это подходит; p

3 голосов
/ 29 мая 2011

Я нашел решение своей конкретной проблемы.

Проблема заключалась в том, что я отмечал свойства (типа интерфейса) как DataMember. Вместо этого помечая соответствующие закрытые члены как DataMember (и убедитесь, что их типы являются конкретными классами), проблема решается.

Пример:

[DataContract()]
public class Company : ICompany
{
    [DataMember(Name = "Employees")]
    private EmployeeList _employees;

    public IEmployeeList Employees { get { return _employees; }}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...