Имена классов, созданные с помощью Svcutil, создают проблему - PullRequest
2 голосов
/ 15 марта 2011

Я пытаюсь сгенерировать прокси в слое Presentation из службы Business Layer ..

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

скажем, Business.AddressInfo и Data.AddressInfo

Сгенерированный прокси-сервер изменяет AddressInfo в Business на AddressInfo1.

Как мне его контролировать?

1 Ответ

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

Это стандартное поведение WCF и его нельзя «контролировать» - так оно и работает.

Когда среда выполнения WCF / svcutil выполняет «Добавить ссылку на службу», она считывает документы службы (WSDL, XSD) и из этих описаний создает прокси на стороне клиента - оба прокси службы (с методами, вызывающими сервис) и представления данных на стороне клиента.

Единственное, что клиент WCF и общий ресурс службы - это представление данных в сети - например, прокси-классы на стороне клиента будут сериализованы в тот же формат XML, что и классы на стороне сервера. В конце концов: WCF - это система для передачи сообщений - между клиентом и сервером нет соединения, кроме сериализованных сообщений.

Эти прокси-классы на стороне клиента генерируются в выбранном вами пространстве имен - вы можете управлять этим, но они всегда будут отдельными классами в отдельном пространстве имен.

Есть два основных способа решения этой проблемы:

  1. вы можете использовать что-то вроде AutoMapper для отображения между этими классами, где это необходимо; поскольку формат сериализации в проводнике одинаков, то же самое относится и к именам свойств, и поэтому сопоставление одного типа объекта другому должно быть очень простым и простым

  2. если вы контролируете оба конца провода, например, и сервер, и клиент, и оба они находятся в .NET, вы также можете поместить все свои сервисные контракты, контракты на данные и т. д. в отдельную сборку библиотеки классов, а затем разделить эту сборку между сервером и клиентом. Таким образом, когда вы делаете «Добавить ссылку на службу», среда выполнения WCF будет повторно использовать существующие типы в общей сборке, на которую есть ссылка, и не будет снова создавать прокси-классы на стороне клиента. С этим «трюком» и ваш сервер, и ваш клиент будут использовать идентичные классы из этой общей совместно используемой сборки.

...