Объекты WCF, множественные ошибки реализации и сериализации IList - PullRequest
2 голосов
/ 07 января 2010

Проблема:

Объекты контракта WCF не могут реализовывать 2 типа списков (то есть: Список и Список).

Длинное объяснение:

Я создаю службу WCF поверх существующей базовой системы и пытаюсь найти наилучший способ реализации некоторых из моих бизнес-объектов.

Базовая система использует интерфейсы для всех бизнес-объектов. Например, для управления персоналом требуется передать объект, который реализует IPerson. Здесь нет ничего необычного.

Цель состоит в том, чтобы иметь контактный объект (Person), который можно использовать на стороне обслуживания, а также реализовать IPerson, чтобы его можно было передавать в ядро, не требуя уровня преобразования. Все это прекрасно работает для таких вещей, как Персона.

Эта проблема возникает для списков: например, метод в ядре может потребовать передачи IPersonList, и, как знает любой, кто имеет дело с унаследованными обобщениями, List не наследует от IList.

В нашем работающем в настоящее время сервисе ASMX мы реализуем это с помощью приведения вверх / вниз в веб-объектах. «WebPerson» будет наследоваться от List и явно реализовывать IList, чтобы свойства IList не отображались в WSDL.

Однако в WCF, если вы попытаетесь использовать этот же объект, вы получите следующую ошибку:

Тип Cssi.IBroker.Service.Cssi.Contracts.PersonList с атрибутом CollectionDataContractAttribute является недопустимым типом коллекции, поскольку он имеет несколько определений интерфейса IList`1.

Очевидно, теперь, когда новый сериализатор WCF знает, как сериализовать IList, он больше не может игнорировать вторую явную реализацию.

Если возможно, я бы хотел избежать создания объекта PersonList только для контрактов и последующего преобразования в и из объекта IPersonList для каждого вызова. Изменение базовой бизнес-логики для использования конкретных объектов, предназначенных только для служб WCF, не вариант.

Помощь!

1 Ответ

0 голосов
/ 27 сентября 2012

В итоге я решил, что лучший маршрут - это набор выделенных объектов, используемых только для контрактов. Благодаря тому, что они посвятили себя одной задаче, я смог сохранить их в чистоте, не ставя под угрозу мой внутренний дизайн ради WSDL. Для самих объектов WSDL я использовал массивы вместо IList.

Дополнительный шаг преобразования немного громоздок, но меньше, чем попытка сохранить мои основные объекты дружественными WCF.

...