Две службы WCF возвращают один и тот же контракт данных клиенту Silverlight - PullRequest
2 голосов
/ 18 февраля 2010

У меня есть две службы WCF, которые логически отличаются, и я хочу, чтобы они были отдельными.У каждого из них есть операция, которая возвращает один и тот же контракт данных.Один клиент Silverlight использует обе услуги.Когда я добавляю ссылку на службу в клиенте silverlight для каждой службы, один сгенерированный код данных заканчивается в сгенерированном коде дважды.Возможно ли, чтобы обе ссылки на сервисы использовали одно и то же определение контракта данных?

Из того, что я прочитал, для клиентов без Silverlight это возможно путем компиляции контрактов данных в отдельную сборку, на которую ссылаются обасервер и клиент.Однако это невозможно при использовании Silverlight (по крайней мере, в Silverlight 3).

Спасибо,Rob

Ответы [ 3 ]

2 голосов
/ 19 февраля 2010

Stian,

Спасибо за быстрый ответ. Я смотрел скриншот Мигеля Кастро, и он был очень информативным. К сожалению, это не покрывает ситуацию с серебряным светом. Однако, используя это в качестве отправной точки, я смог заставить что-то работать, что другие могут найти полезным.

Создайте две сборки: ServerDataContracts и SilverlightDataContracts (эта как сборка silverlight). В каждый файл AssemblyInfo.cs добавьте следующую строку:

[assembly: ContractNamespace("http://YourNamespaceUri",
 ClrNamespace = "YourDataContractsNamespace")]

Добавьте все ваши DataContracts в сборку ServerDataContracts. В сборке SilverlightDataContracts щелкните правой кнопкой мыши проект (или подпапку) и выберите «Добавить существующий элемент». Найдите DataContracts в сборке ServerDataContracts и выберите те, которые вы хотите добавить. НЕ ХИТ "Добавить" !!! Вместо этого нажмите стрелку вниз рядом с «Добавить» и выберите «Добавить как ссылку». Это связывает проект SilverlightDataContracts с существующими файлами в проекте ServerDataContracts. Теперь, когда вы редактируете один, оба проекта получают изменения. Когда вы компилируете, проекты компилируются отдельно с их правильными целями.

Теперь добавьте сборку ServerDataContracts в качестве ссылки на ваш проект контракта на обслуживание. Сделайте то же самое для вашей сборки SilverlightDataContracts в приложении Silverlight. Когда вы добавляете ссылку на службу из вашего клиента Silverlight в вашу службу, она не должна генерировать контракты данных. Вместо этого он должен использовать те из вашей сборки.

Я получил эту работу, однако в ней все еще отсутствуют некоторые функции, предоставляемые сгенерированными классами сбора данных. Сгенерированные классы реализуют INotifyPropertyChanged, что чрезвычайно полезно при привязке данных в silverlight / wpf. Хотя вы можете реализовать это самостоятельно, это довольно утомительно, и теперь ваш серверный код должен выполнять все эти обработчики событий для каждого набора свойств, даже если вы, вероятно, никогда не подпишетесь на событие PropertyChanged на сервере.

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

1 голос
/ 26 февраля 2010

Вы пытались создать клиентов с помощью svcutil. Если вы предоставляете несколько конечных точек обслуживания, все работает нормально, но при этом возникает множество ошибок при генерации клиентов.

0 голосов
/ 19 февраля 2010

Это раздражает, но это сработало. У меня есть одна основная служба и несколько вспомогательных служб. Основная служба, к которой относятся все контракты данных, и вспомогательные службы должны повторно использовать контракты данных, указанные в основной службе.

Я создал сборку silverlight, чтобы выступать исключительно в качестве клиента основного сервиса. Тогда у меня была ссылка на приложение Silverlight. Затем в приложении Silverlight я добавил свои услуги поддержки. При добавлении вспомогательной службы на расширенном экране можно указать, следует ли ей повторно использовать типы в ссылочных сборках. Он включен по умолчанию. Поскольку основная служба указана в ссылочной сборке, все вспомогательные службы используют контракты данных от основной.

Это не красиво, но работает.

...