2008-10-21 3 views
5

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

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

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

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

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

myServiceInstance.MyClass cls = new myServiceInstance.MyClass() 

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

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

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

+0

Если вы хотите отобразить фрагмент кода в другом, более различимом формате, отредактируйте свой вопрос, выберите текст кода и нажмите на значок с 01010 рядом с гигантскими кавычками. – DOK 2008-10-21 11:09:09

ответ

2

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

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

3

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

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

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

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

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

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