2012-06-06 2 views
0

У меня есть следующий (упрощенный) сценарий.Взаимодействие с клиентами и объектами отображения веб-сервиса

Существует служба WCF (MyService), которая предоставляет некоторую сущность MyEntityDTO. На стороне клиента я создал интерфейс IMyServiceClient, который передается моим клиентским компонентам, поэтому они могут запрашивать MyEntityDTO из любой базовой реализации. А также теперь я могу запускать клиентские модульные тесты с использованием некоторого MockedMyServiceClient: IMyServiceClient. Кажется, все хорошо.

Теперь я создал фактический MyRealWCFServiceClient: IMyServiceClient, который по существу просто обертывает ссылку на службу WCF, созданную Visual Studio.

Одна из проблем заключается в том, что ссылка на службу WCF возвращает совершенно другой вид MyEntityDTO, поэтому мне нужно сопоставить его с типом сущности ссылки службы на тип MyEntityDTO, который возвращается из IMyServiceClient. Для этого я могу использовать AutoMapper.

Но здесь самая большая проблема. Предположим, я хочу повторно использовать myRealWCFServiceClient в некоторых других приложениях в моем проекте. Если каждое из этих приложений будет иметь свою собственную ссылку на службу WCF со своими собственными типами DTO, мне придется каким-то образом передать все типы DTO текущей ссылки службы и настроить AutoMapper каким-то хитрым Reflection, чтобы вставлять в нее мои общие типы. Какой беспорядок ...

Но я мог бы собирать свои общие ссылки WCF с их оболочками MyRealWCFServiceClients в какой-то общей библиотеке, поэтому все пользователи MyRealWCFServiceClients используют только те известные общие ссылки WCF.

Интересно, полезно ли создавать общую библиотеку для ссылок на службы? Есть ли лучшее решение для этого?

+0

Что именно вы подразумеваете под «ссылкой службы WCF, возвращает совершенно другой вид MyEntityDTO»? Не является ли MyEntityDTO типом, сгенерированным генератором VS-прокси-сервера? –

ответ

1

Если вы создаете общий клиент, то я бы создал его как распределяемую сборку, которая отправляется со стороны службы. Другими словами, создайте общий клиент, а затем распределите его. Не создавайте прокси-сервер с клиентской стороны.

Что касается того, что создается другой прокси-сервер (для DTO), если вы можете ссылаться на сборку контракта, которая содержит реализацию DTO. И затем используйте VS для создания прокси, генератор прокси-сервера достаточно умен, чтобы использовать исходные DataContracts, на которые ссылаются (а не genereate new proxy classes).

Итак, у вас есть два выбора, я думаю. Во-первых, создайте проект, который является общим клиентом, а затем распределите его. И/Или два, ссылайтесь на каталог сборки контрактов перед созданием клиентской стороны.

Надеюсь, это поможет.

+0

О, я не знал, что VS достаточно умен, чтобы найти мои DTO, если я свяжусь с библиотекой перед созданием клиента. Это очень поможет, спасибо. – JustAMartin

Смежные вопросы