Служба ODF WCF с поставщиком отражений - PullRequest
6 голосов
/ 17 сентября 2010

Нам нужно предоставить API для ленты новостей (например, Facebook), и мы решили попробовать OData.Мы используем .NET, поэтому мы выбрали сервис данных WCF, но мы не используем Entity Framework (или любой другой ORM), поэтому мы будем использовать Reflection Provider.Поскольку у нас есть сложная бизнес-логика для наших методов поиска, мы решили представить их как сервисные операции.Однако мы хотим выставить Delete / Update и выбор одной сущности как обычный ресурс REST OData.Мой вопрос заключается в том, как мы можем реализовать источник данных для поставщика отражений, который ограничивает доступ к коллекциям, но разрешает доступ к отдельным объектам (запрашивается ключом), разрешает глаголы DELETE / PUT / POST, а также позволяет получать доступ к дочерним коллекциям отдельных объектов (т. Е. К сервису)./ Категория (1) / Продукция).В основном я хочу ограничить доступ только к базовым коллекциям (например, сервис / категории или сервис / продукты)

1 Ответ

5 голосов
/ 17 сентября 2010

Здесь нет хорошего ответа.

В InitializeService (..) можно использовать две настройки * .. 1003 *

config.SetEntitySetAccessRule("Feed", EntitySetRights.ReadSingle);
config.SetEntitySetPageSize("Feed", 1);

К сожалению, не делайте точно, что вы хотите:

  1. EntitySetRights.ReadSingle ограничивает вас возвратом только одного объекта из этого набора. Что не удается, потому что это не позволяет / Categories (1) / Products И также позволяет / Categories? $ Filter = ... возвращать строку.
  2. SetEntitySetPageSize ограничивает объем начальной нагрузки, попадающей на сервер, только одной записью, но вы можете следовать $ skiptoken, чтобы идти и получать оставшиеся данные по одной записи за раз, и точно так же, как (1) он разрешает произвольные запросы не только ключевые предикаты.

Это оставляет вам только один реалистичный вариант. Посещение выражения LINQ и разработка, если вы разрешите то, что предпринимается.

Поскольку вы используете провайдер Reflection, вам, по сути, нужно обернуть IQueryables, возвращаемые из вашего класса 'context', и искать недопустимые запросы перед их передачей.

Не для слабонервных.

Если вы решите пойти по этому пути, вы найдете мой пример упаковки IQueryable полезным, и вам следует проверить серию публикаций в блоге Viteks по выражениям Data Service тоже.

Надеюсь, это поможет

Алекс (менеджер программ OData)

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