2010-09-17 8 views
6

Necesitamos proporcionar una API para un Feed de actividad (piense en Facebook) y decidimos probar OData. Estamos usando .NET, así que buscamos el Servicio de datos WCF, pero no utilizamos Entity Framework (ni ningún otro ORM), por lo que usaremos el proveedor de reflexiones. Debido a que tenemos una lógica comercial compleja para nuestros métodos de recuperación, decidimos exponerlos como operaciones de servicio. Sin embargo, queremos exponer Eliminar/Actualizar y selección de entidad única como un recurso REST OData normal. Mi pregunta es cómo podemos implementar una fuente de datos para el proveedor de reflexión que restringe el acceso a colecciones pero permite el acceso a entidades individuales (solicitadas por clave), permite verbos DELETE/PUT/POST y también permite acceder a colecciones secundarias de entidades individuales (es decir, servicio/Categorías (1)/Productos). Básicamente, solo quiero restringir el acceso a las colecciones base (es decir, servicio/Categorías o servicio/Productos)Servicio WCF OData con el Proveedor de Reflecciones

Respuesta

5

No hay una gran respuesta aquí.

Hay dos configuraciones que se usa en el interior InitializeService (..)

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

Desafortunadamente, ni hacer exactamente lo que quiere:

  1. EntitySetRights.ReadSingle le limita a devolver sólo un objeto de la establecida. Lo cual falla porque no permite esto/Categorías (1)/Productos Y también permite que/Categories? $ Filter = ... devuelva una fila.
  2. SetEntitySetPageSize restringe la cantidad de carga inicial que llega al servidor a solo un registro, pero puede seguir $ skiptoken para ir y obtener el resto de los datos un registro a la vez y al igual (1) permite consultas arbitrarias no solo predicados clave.

Eso lo deja con una sola opción realista. Visitando la expresión LINQ y resolviendo si permite lo que se intenta.

Dado que está utilizando el proveedor de Reflection, básicamente necesita ajustar las IQueryables que se devuelven desde la clase 'context' y buscar las consultas no válidas antes de pasarlas.

No es algo para los desanimados.

Si decide seguir por ese camino, encontrará que mi IQueryable wrapping example es útil, y también debe consultar Viteks blog post series on Data Service expressions.

Esperanza esto ayuda

Alex (OData Administrador de programas)

+2

Muchas gracias. De hecho, leí su ejemplo de envoltura y la serie de proveedor de datos personalizados cuando estaba evaluando las opciones. La primera solución no parece tan mala en realidad. Tendré que verificar cuántas entidades tendrán colecciones secundarias y cuántas tendré que trabajar. Otra cosa que estaba vagando fue si está bien lanzar una excepción en estas situaciones. Parece malo, pero las otras opciones tampoco son bonitas. Envolver el IQueryable parece realmente doloroso. Honestamente, prefiero descartar la solución OData e ir a otro tipo de servicio que hacer esto. – Stilgar

Cuestiones relacionadas