Obecnie eksperymentuję z punktami końcowymi OData w ASP.NET MVC 4 Web API. Podoba mi się ta koncepcja i staram się wymyślić skuteczne sposoby jej wykorzystania w naszym projekcie. Jedno pytanie mam jest następujący: mamy usługę, która jest w stanie zwrócić IQueryable i przyjmuje nazwę podmiotu jako wejście:ASP.NET WebAPI: kontroler ogólny dla punktu końcowego OData
public IQueryable GetAll(string entityName);
W standardzie Web API (w przeciwieństwie do kontrolerów OData) mogę utwórz ogólny kontroler, który można wywołać w formularzu/api/entity/{entityName} i zwróci IQueryable. W przypadku kontrolera OData, I przeprowadzić następujące czynności podmiot specyficzne:
- zarejestrować podmioty w modelu.
- Utwórz oddzielny kontroler dla każdej jednostki, która pochodzi od EntitySetController <>.
Chcę używać usługi ogólnej i unikać jak największej liczby implementacji specyficznych dla jednostki. Pierwszy krok można łatwo zautomatyzować, jeśli usługa może zwrócić listę podmiotów i odpowiadające im typy. Zostawia to krok 2, ponieważ do tej pory muszę utworzyć określony kontroler dla każdej jednostki. Też chcę tego uniknąć i stworzyć ogólny kontroler, który używa ogólnej usługi.
Czy ktoś może polecić rozwiązanie, może wpływając na routing OData?
Należy sprawdzić odataPath dla elementów null. Oznacza to zapytania o dane meta, które muszą przejść do domyślnej trasy. if (odataPath.EdmType == null || odataPath.EntitySet == null) zwraca wartość null; – xt1
To również rozwiązało problem z uzyskaniem v3 i v4 w tym samym projekcie, ponieważ nie można mieć zduplikowanych nazw kontrolerów, a próba użycia atrybutu route na innej nazwie kontrolera powoduje 406. Dla konwencji nazwy kontrolera EntityV4Controller, zwracając odataPath.NavigationSource.Name + "V4" znajdzie kontroler. –
Metoda sprawdzania zapytań o metadane @ xt1 jest podobno powszechna, ale nie jest wiarygodna. Nasz projekt zawiera sytuacje, w których 'odataPath.EntitySet == null', ale nie jest to żądanie metadanych $. Odkryłem, że sprawdzanie połączenia 'ODataSegmentKinds.ServiceBase' i' ODataSegmentKinds.Metadata' jest bardziej niezawodne.(Dotyczy usługi V3.) –