WCF с несколькими службами и проблемами пространства имен - PullRequest
3 голосов
/ 26 января 2010

Я создал несколько служб WCF, для аргументов они называются Service1 и Service2 .

Обе службы возвращают (в какой-то момент, возможно, через отношения внутри объекта) Клиент объект.

Для тестирования я добавил метод GetCustomer () для Service1 и Service2, а также добавил ссылку на службу для обеих служб в базовом приложении WinForms.

Service1Client proxy1 = новый Service1Client ();

Customer customer1 = proxy1.GetCustomer (); //

^^^^^^ Неоднозначная ссылка, требует, чтобы я назвал WcfTestClient.Service1.Customer

Service2Client proxy2 = новый Service2Client ();

Customer customer2 = proxy2.GetCustomer ();

^^^^^ Неоднозначная ссылка, требует, чтобы я назвал WcfTestClient.Service2.Customer

Проблема в том, что объект Customer, возвращаемый Service1 и Service2 , относится к типу Customer одного и того же (WcfTestService.Customer). Чтобы исправить это, мне нужно указать полное имя сборки, а не просто Customer.

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

Другое решение, которое я видел, - это метод SvcUtil.exe, но из того, что я видел, это решение не решает мою проблему с пространством имен, поскольку мне нужно запускать Util для каждой службы отдельно?

Если у кого-нибудь есть полезные предложения, пожалуйста, свяжитесь с нами!

1 Ответ

4 голосов
/ 26 января 2010

Обе службы возвращают (в какой-то момент, возможно, через отношения внутри объекта) объект Customer.

Здесь ты ошибаешься. WCF не возвращает объекты, REST не возвращает объекты, SOAP не возвращает объекты. Все они передают сообщений .

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

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

...