2010-09-17 9 views
6

Nous devons fournir une API pour un flux d'activité (pensez à Facebook) et nous avons décidé d'essayer OData. Nous utilisons .NET, donc nous avons opté pour le service de données WCF mais nous n'utilisons pas Entity Framework (ou tout autre ORM) donc nous allons utiliser le fournisseur de réflexion. Parce que nous avons une logique commerciale complexe pour nos méthodes de récupération, nous avons décidé de les exposer comme des opérations de service. Cependant, nous voulons exposer Delete/Update et la sélection d'une seule entité comme une ressource OData REST normale. Ma question est comment pouvons-nous implémenter une source de données pour le fournisseur de réflexion qui restreint l'accès aux collections mais autorise l'accès aux entités individuelles (demandé par clé), autorise les verbes DELETE/PUT/POST et permet également d'accéder aux collections enfants/Catégories (1)/Produits). Fondamentalement, je veux seulement restreindre l'accès aux collections de base (c'est-à-dire service/catégories ou service/produits)Service OData WCF avec Reflection Provider

Répondre

5

Il n'y a pas une bonne réponse ici.

Il y a deux paramètres que vous pouvez utiliser à l'intérieur InitializeService (..)

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

Malheureusement non plus exactement ce que vous voulez:

  1. EntitySetRights.ReadSingle limites vous à retourner un seul objet de cet ensemble. Lequel échoue car il ne permet pas cela/Categories (1)/Products ET il permet également/Categories? $ Filter = ... de retourner une ligne.
  2. SetEntitySetPageSize limite la quantité de charge initiale sur le serveur à un seul enregistrement, mais vous pouvez suivre le $ skiptoken pour aller chercher le reste des données un enregistrement à la fois et tout comme (1) il permet des requêtes arbitraires non seulement prédicats clés.

Cela vous laisse avec une seule option réaliste. Visiter l'expression LINQ et travailler si vous autorisez ce qui est tenté. Étant donné que vous utilisez le fournisseur de réflexion, vous devez essentiellement renvoyer les objets IQueryables renvoyés par votre classe «context» et rechercher des requêtes non valides avant de les transmettre.

Pas quelque chose pour les cœurs évanouis.

Si vous décidez de descendre ce chemin, vous trouverez mon IQueryable wrapping example utile, et vous devriez également consulter Viteks blog post series on Data Service expressions.

Hope this helps

Alex OData (gestionnaire de programme)

+2

Merci beaucoup. En fait, j'ai lu votre exemple d'emballage et la série de fournisseurs de données personnalisés lorsque j'évaluais les options. La première solution ne semble pas si mauvaise en réalité. Je vais devoir vérifier combien d'entités auront des collections d'enfants et combien je vais devoir contourner. Une autre chose que je me suis promené était si c'est juste de lancer une exception dans ces situations. Cela semble mauvais mais les autres options ne sont pas belles non plus. Envelopper l'IQueryable semble vraiment douloureux. Honnêtement, je préfère abandonner la solution OData et opter pour un autre type de service que cela. – Stilgar