Использование одного и того же DataContract между Сервисами - PullRequest
1 голос
/ 04 июня 2009

Я пишу несколько служб WCF, которые предоставляют данные, извлекаемые из Entity Framework, и, следуя шаблонам, управляемым доменом, у меня есть хранилище для каждого агрегата. Конкретный пример - это набор вопросов и ответов. Существует Репозиторий Вопросов и Репозиторий Ответов.

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

Есть ли способ обойти эту проблему? Можно ли разместить два ServiceContracts в одном сервисе? Можно ли сделать так, чтобы WCF повторно использовал контракты данных, сгенерированные другой службой?

Спасибо, Рой

Ответы [ 2 ]

2 голосов
/ 04 июня 2009

Вы обязательно должны иметь общий DataContract, используемый двумя отдельными службами, IQuestionService и IAnswerService.

У вас есть оба конца провода, например и клиент и сервер? Оба .NET / WCF? В этом случае вы можете, например, поместите ваш DataContract и все ваши общие интерфейсы в одну отдельную сборку и поделитесь этой сборкой между двумя службами, как на сервере, так и на клиенте.

На клиенте, если вы запустите svcutil, вы можете указать ему использовать типы из данной общей сборки, например, скажи ему НЕ , чтобы заново создать типы данных Question и Answer, но использовать их из своей сборки. Проверьте параметр /reference (или /r) svcutil.

svcutil (your WSDL) /r (your common assembly here) ......

Или другой вариант - пропустить svcutil все вместе, создать свой ChannelFactory и т. Д. И создать экземпляр клиента 100% вручную, без ссылки на сервис и т. Д.

ChannelFactory<IQuestion> cFac =
   new ChannelFactory<IQuestion>("ConfigName");
IQuestion proxy = cFac.CreateChannel();

, а затем используйте объект proxy, подобный тому, который вы используете сейчас, сгенерированный svcutil.

Это, конечно, работает, только если у вас есть оба конца провода.

Марк

0 голосов
/ 04 июня 2009

Я считаю, что одна вещь, которая может вам помочь, - взглянуть на класс DataContractAttribute, который позволяет вам указывать имя и пространство имен для сериализации.

Тем не менее, если вы используете одни и те же логические элементы, этого должно быть достаточно, чтобы сделать их совместимыми между службами.

Все зависит от WSDL, сгенерированного конечной точкой MEX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...