Вопрос

Использование VS 2008 и .NET 3.5 SP1:

Я использую WCF, чтобы разрешить клиентам подключаться к службе, которая считывает и записывает записи базы данных с помощью Entity Framework.По умолчанию к объектам, которые автоматически создаются из базы данных, применяется атрибут DataContract.

К сожалению, многие из доступных полей не предназначены для использования клиентом (т.е.- записи о том, кто получает доступ к каким данным и т.д.) и по соображениям безопасности я бы предпочел, чтобы они не были раскрыты.Есть ли какой-нибудь способ избежать раскрытия классов Entity Framework таким образом?

Примечание:Это не дубликат Как предотвратить раскрытие частных свойств в объектах .NET как общедоступных через сервисы?.В этом вопросе пользователь хочет выборочно отображать определенные поля, тогда как я бы хотел, чтобы объект вообще не отображался как DataContract .

Заранее благодарю.

Это было полезно?

Решение

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

Модель сущности предназначена для того, чтобы быть концептуальной моделью.Вы можете легко создать набор объектов для доступа к одному набору клиентов (возможно, веб-службам) и другой набор, сопоставленный с той же базой данных, который предназначен для другого клиента (возможно, веб-приложения).

С другой стороны, я всегда рекомендую никогда не предоставлять доступ к объектам Entity Framework через веб-сервис.К сожалению, Microsoft предоставляет свойства, зависящие от реализации, помечая их [DataMember].Я только сейчас попробовал это с помощью простого сервиса, возвращающего SalesOrderHeader из AdventureWorks.Мой клиент получил прокси-версии следующих типов EF:

  • Элемент - ключ - член
  • Структурный объект
  • Объект EntityObject
  • EntityKey ( Ключ сущности )
  • Ссылка на объект
  • Связанный конец

Это не те вещи, о которых вашим клиентам нужно знать.

Я предпочитаю предоставлять доступ к объектам передачи данных и копировать свойства из одного в другой.Очевидно, что это лучше сделать с помощью рефлексии или генерации кода, чем вручную.В прошлом я делал это с помощью генерации кода (шаблоны T4).

Вариант, который я еще не пробовал, это Автоматический преобразователь.

Другие советы

Мы используем отдельные классы для объектов DataContract.У нас есть интерфейс с одним методом, ToContract(), и все наши объекты реализуют этот интерфейс в файле частичного класса.Это дополнительная работа, и она шаблонна, но, по-видимому, это самый простой способ добиться необходимого нам разделения и детализации управления.

Я в принципе вижу две вещи, которые вы можете сделать:

  1. Либо вы удаляете те элементы, которые не хотите предоставлять из DataContract, вручную удаляя атрибут [DataMember] для этих элементов;в этом случае WCF не будет сериализовывать свойства из
  2. Вы определяете свои собственные классы WCF DataContract только с теми элементами, которые вам нужны, и вы разрабатываете логику для преобразования ваших объектов EF в ваш WCF DataContract, используя, напримерчто - то вроде Автоматический преобразователь чтобы исключить (или, по крайней мере, ограничить) утомительные операции присвоения между объектами EF и WCF.

Марк

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top