Пусть Visual Studio совместно использует пространство имен с несколькими ссылками на службы.

Есть ли какой-либо способ, кроме ручного кодирования файла Reference.cs, чтобы Visual Studio разрешила нескольким ссылкам на службы совместно использовать пространство имен?

Я разрабатываю клиентское приложение, которое использует несколько служб, являющихся частью одного и того же решения. Что-то вроде интерфейса API Project Service Interface (PSI), который Microsoft имеет для MS-Project Server. Вместо того, чтобы иметь другое пространство имен для каждой отдельной ссылки на службу, например:

MyProject.ProjectService.ProjectServiceClient
MyProject.ResourceService.ResourceServiceClient
MyProject.TimesheetService.TimesheetServiceClient

было бы неплохо, если бы мы могли поместить их все в одно пространство имен, например:

MyProject.Services.ProjectServiceClient
MyProject.Services.ResourceServiceClient
MyProject.Services.TimesheetServiceClient

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

Это возможно?

ОБНОВЛЕНИЕ

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


person SonOfPirate    schedule 21.03.2011    source источник
comment
Какая версия Visual Studio? И вы используете ссылки на службы или веб-ссылки?   -  person CodingGorilla    schedule 21.03.2011
comment
Я использую Visual Studio 2010 и добавляю ссылку на службу. (Использование PSI было только для примера.)   -  person SonOfPirate    schedule 21.03.2011


Ответы (1)


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

person John Saunders    schedule 21.03.2011
comment
Да, я понимаю это. Я просто надеюсь, что есть способ сделать его немного чище — или, лучше сказать, автоматическим. - person SonOfPirate; 21.03.2011
comment
Это замечательный метод, и он имеет много преимуществ, если вы контролируете как серверную, так и клиентскую стороны своих сервисов. Я думаю, что моя любимая особенность этого метода заключается в том, что вам больше не нужно поддерживать эти неуклюжие каталоги ссылок на службы и файлы Reference.cs, черт возьми, это просто болезненно. - person Chris O; 21.03.2011
comment
@Chris: у вас все еще есть файлы Reference.cs, просто в них меньше. - person John Saunders; 21.03.2011
comment
@ Джон Сондерс, я бы сделал все возможное и сделал бы твои собственные файлы Reference.cs. Таким образом, вы можете получить ошибки времени компиляции, когда кто-то из вашей счастливой команды разработчиков изменит контракт и забудет обновить все клиентские ссылки (это намного предпочтительнее, чем обнаружение нарушенных изменений контракта во время выполнения ;-) - person Chris O; 21.03.2011
comment
@Chris: Я бы использовал автоматические функциональные тесты после сборки, если это вообще возможно, чтобы обнаружить проблему во время ночной сборки. Требуется некоторая инфраструктура, но оно того стоит. - person John Saunders; 21.03.2011
comment
@John Saunders, достаточно честно, это будет работать отлично, и я надеюсь, что оно также должно хорошо работать в среде CI. - person Chris O; 21.03.2011
comment
Другой аспект — когда сервисы недоступны (например, разработаны третьей стороной), поэтому совместное использование общей библиотеки классов невозможно. - person SonOfPirate; 21.03.2011
comment
И, к сожалению, политика компании заключается в том, чтобы максимально использовать все встроенные инструменты. Так что, хотя я вполне доволен идеей написанного вручную решения, похожего на Reference.cs, мы вынуждены использовать функцию «Добавить ссылку на службу». - person SonOfPirate; 21.03.2011
comment
@Son: Add Service Reference работает с решением библиотеки классов. Вы правы, что это не работает для сторонних сервисов. - person John Saunders; 21.03.2011