Linq для сущностей с WCF - PullRequest
5 голосов
/ 21 октября 2008

Все мои сущности находятся в отдельном проекте в моем файле edmx, и я предоставляю их клиентскому приложению с помощью службы WCF.

Это означает, что мне не нужно давать моему клиентскому приложению прямую ссылку на проект, содержащий файл edmx. Это было бы плохо, потому что он ограничивает объект для запроса к базе данных.

Но из моего клиентского приложения могут быть доступны только те объекты, которые использует моя служба WCF. Так, например, потому что у меня есть следующий код в моем сервисе:

public MyClass GetMyClass()
{
     return new MyClass();
}

.. Я могу использовать доступ MyClass в своем клиентском приложении с чем-то вроде:

myServiceInstance.MyClass cls = new  myServiceInstance.MyClass()

А если в моем файле edmx есть сущность MyClass2, которую я хочу использовать в своем клиентском приложении! Как создать его экземпляр, не предоставляя моему клиенту прямую ссылку на мой файловый проект edmx или создав бесполезный метод в моем слое обслуживания, который возвращает MyClass2

Что делают другие люди?

Большое спасибо

Ответы [ 3 ]

3 голосов
/ 21 октября 2008

Мы создали отдельный проект с классами объектов передачи домена, которые служили в качестве контрактов данных для наших различных внутренних служб WCF. Затем мы поделились проектом контрактов с этими внутренними службами. У нас была одна служба данных; эти методы будут переводить эти доменные объекты в / из объектов сущности до / после сохранения / извлечения. Между тем внешние службы использовали стандартные прокси-серверы, сгенерированные из файлов XSD и WSDL и переведенные в / из модели передачи в общий домен.

Нам пришлось это сделать, потому что контекст объекта (пока) не переносим через WCF , к сожалению.

Некоторые соображения для вашей ситуации:

  1. Если ваше клиентское приложение внешнее для вашей системы, оно не должно ничего знать о вашем EDMX или его классах. Он должен знать только о вашем WSDL и XSD.
  2. Если ваше клиентское приложение внутреннее , то нет смысла пытаться совместно использовать классы сущностей в EF v1, поскольку оно еще не поддерживается должным образом. Вам нужно передавать больше, чем просто классы / объекты - вам также нужен контекст, который поддерживает отслеживание изменений, и это нельзя сделать прямо сейчас через WCF.
2 голосов
/ 21 октября 2008

Если служба WCF не использует ее, для чего она вам нужна? Служба WCF (сама по себе) предназначена исключительно для передачи данных - подход «метаданных» для метаданных не разделяет код, поэтому ваш MyClass2 окажется бессильным. Если вы хотите, вы можете использовать совместное использование сборок на клиенте, но я действительно не рекомендую это в этом случае; Объекты EF на клиенте - беспорядок ... (плюс он не будет работать на легких платформах, таких как Silverlight, Client Profile, Compact Framework и т. Д.)

Другой вариант - ADO.NET Data Services ; это работает над WCF, но дает вам более дружественный к LINQ API, чем обычный подход WCF - и любые объекты домена, которые предоставляет ваша модель, должны быть доступны в контексте данных клиента.

1 голос
/ 21 октября 2008

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

Другой способ справиться с этим - просто использовать svcutil (или «Добавить ссылку на службу ...», хотя svcutil лучше работает для нескольких конечных точек службы) для генерации всех классов, которые будет использовать клиент, вместо добавления ссылки на серверный проект. Таким образом, единственные классы, которые ваш клиент когда-либо увидит, это те, которые предоставляет служба.

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