Простой способ отправки сущностей через WCF - PullRequest
2 голосов
/ 10 августа 2011

Я создаю веб-сайт, используя Entity Framework (4.1), который предоставляет службы WCF, и у меня есть клиент Silverlight, взаимодействующий с сервером через WCF.Я хочу отправить (и, возможно, получить) некоторые сущности через службу WCF, без создания класса прокси / оболочки и т. Д.Например, у меня есть тип сущности User с полями «Имя пользователя», «Пароль», «Электронная почта» (на самом деле их гораздо больше, но они сокращены просто для простоты), и я хочу отправить этот объект клиенту Silverlight.При отправке имени пользователя и электронной почты я (очевидно) не хочу отправлять свойство пароля клиенту.Теперь я пишу оболочку с атрибутами [Serializable] и [DataContract] с полями, имеющими атрибут [DataMember], который включает в себя только те поля, которые мне нужны, создайте новый экземпляр, скопируйте значения из объекта-сущности,и отправьте этот прокси-объект.Это работает, но неудобно и крайне больно.Что мне нужно, так это механизм, в котором я могу напрямую установить свойства, которые я хочу отправить, и просто не раскрывать ничего другого.Я не могу изменить код модели объекта (для добавления / редактирования атрибутов), так как он автоматически генерируется каждый раз, когда я касаюсь EDMX.Есть ли способ выполнить выставление клиентам только выбранных членов?

1 Ответ

2 голосов
/ 10 августа 2011

Чтобы избежать появления PROXY на клиенте, вы можете повторно использовать одни и те же объекты (на стороне клиента и сервера), убедившись, что ваш клиент уже ссылается на сборку объекта сервера (при условии, что вы отобразили POCO в EF и разделили их насобственная сборка).Затем проверьте дополнительные параметры в справочнике по серверу и убедитесь, что установлен флажок «Повторное использование типов в ссылочных сборках».

Это создаст прокси-интерфейс и клиент, но повторно использует серверные сущности.

Вы можетеИзбегайте использования прокси-интерфейса, используя ClientBase <> generic вместо ссылки на службу, хотя теперь вам нужно будет разделить интерфейсы на стороне службы (интерфейсы контракта на обслуживание) в отдельную сборку и ссылаться на нееи Клиент, и Сервер.

И, согласно вашему наблюдению, если вы не пометите Свойство в своей сущности как [DataMember], оно не будет сериализовано.Поскольку у вас есть одна и та же сущность с обеих сторон, поля like будут отображаться в качестве значения по умолчанию (0, ноль и т. Д.) На клиенте.

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