Проблема:
Объекты контракта 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, не вариант.
Помощь!