Преобразование типа из службы WCF - PullRequest
5 голосов
/ 08 марта 2011

Я уверен, что это должно быть довольно распространенная проблема. У меня есть две службы WCF, которые в основном предоставляют стандартный доступ и доступ администратора к одной более крупной службе.

Существует аналогичный метод Foo для каждого сервиса. Foo принимает аргумент типа TemplateInfo, который определен в моем сервисе.

На моем клиенте у меня есть ссылка на Client и AdminClient. Client.Foo(TemplateInfo) ожидает Client.TemplateInfo, а AdminClient.Foo(TemplateInfo) ожидает AdminClient.TemplateInfo. Я знаю, что как только обслуживание достигнуто, Client.TemplateInfo и AdminClient.TemplateInfo - это одно и то же.

Я пытаюсь выяснить, как создать экземпляр TemplateInfo и / или привести его к работе с методами как клиента, так и администратора. Для создания этого объекта достаточно кода, поэтому я надеялся не дублировать его для каждого типа.

Типы определены в общих сборках, и я использую «Повторное использование типов» в моем прокси. Но я получаю два разных типа, потому что у меня есть две ссылки на сервис.

Было бы здорово сделать что-то вроде (AdminClient) TemplateInfo, но, возможно, я создам метод клонирования для преобразования типов.

Ответы [ 3 ]

4 голосов
/ 08 марта 2011

Нет способа сделать это. Они бывают разных типов.

Вы можете поместить этот тип в библиотеку классов, на которую ссылаются обе службы и клиент. Вы можете указать «Добавить ссылку на службу» для повторного использования типов (это по умолчанию), и тогда это будет тип из используемой библиотеки классов.


Обратите внимание, что клиентское приложение также должно ссылаться на ту же библиотеку классов, что и две службы.

1 голос
/ 08 марта 2011

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

Ричард опередил меня с некоторыми подсказками о том, как это сделать, если вы используете visual studio.

Но

Один из основных принципов сервис-ориентированной архитектуры - «Сервисы совместно используют схему и контракт, а не класс».

Есть много хороших статей, объясняющих это лучше, чем я.Википедия - хорошее начало, или эта статья появилась в далеком прошлом, когда у WCF было классное имя.http://msdn.microsoft.com/en-us/magazine/cc164026.aspx

1 голос
/ 08 марта 2011

Либо не полностью сгенерировать ссылку на службу, вы можете поместить типы службы в общую сборку между клиентом и службой и проверить "Повторное использование типов в ссылочных сборках" или что-то подобное при создании класса клиента.

...