2013-08-14 11 views
19

Czy ktoś może mi wyjaśnić, kiedy powinienem dziedziczyć mój formularz kontrolny ODataController kontra ApiController?ApiController kontra ODataController podczas ujawniania DTO

Pytanie jest spowodowane faktem, że wyniki zwrócone przez ApiController mogą być filtrowane za pomocą zapytania OData.

Jeśli zastosuję QueraybleAttribute do metod programu contollera, zapytanie zostanie przetworzone, nawet jeśli akcja zwróci IEnumerable.
Jednak bez tego atrybutu, ale z wywołaniem config.EnableQuerySupport(), zapytanie jest przetwarzane tylko wtedy, gdy metoda zwróci IQueryable.
Myślę, że to nie jest spójne zachowanie. WebAPI documentation and examples sugeruje, że kontroler musi odciążyć się od ODataController. I jestem nieco zdezorientowany.
Albo ApiControlleraccidentally i częściowo obsługuje część (przynajmniej $ pominięcie, $ filtr i $ górę) protokołu OData. Lub jest to zgodne z projektem i potrzebuję ODataController do kompletnego ODataSupport.

Prawdziwym problemem jest to, że moja usługa naraża DTO, a nie POCO. Nie może istnieć jedno do jednego odwzorowania. Konieczne jest przekonwertowanie zapytania OData ponownie DTO do zapytania EF na POCO.
Teraz tylko gra z OData. Pobieram encje i zamieniam je na DTO. Prawdą jest, że nie jest to bardzo wydajne, aby uzyskać wszystkie z DB dla każdego żądania, ale tolerować eksperymenty. Jednak nie ma potrzeby zwracania wszystkich elementów do klienta, jeśli wymaga on niektórych filtrowanych podzbiorów DTO.
Zapytanie OData zaczęło działać po wyjęciu z pudełka z atrybutem ApiController i Querayble, ale wspomniana wyżej niespójność sprawia, że ​​coś robię źle.

+3

Myślę, że to dlatego, że realizuje dodatkowe funkcje jak metadanych umożliwiający klienta WCF Data Services do wykorzystania: http://sravi-kiran.blogspot.co.nz/2013/ 08/ConsumingWebApiODataFromNetAndJavaScriptClientApplications.html, http://blogs.msdn.com/b/webdev/archive/2013/01/29/getting-started-with-asp-net-webapi-odata-in-3-simple-steps.aspx, http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api. Web API (z obsługą zapytań) pojawił się w styczniu 2012 r., A interfejsy API w interfejsie API w styczniu 2013 r., Więc myślę, że masz rację z tym, że "Potrzebuję ODataController dla kompletnego ODataSupport", aby dopasować specyfikację OData. – Michael

Odpowiedz

8

Czy ktoś może wyjaśnić mi, kiedy mam odziedziczyć moja forma kontroler ODataController vs ApiController?

co chcesz dziedziczyć z ODataController jeśli chcesz narazić punkt końcowy, który przylega do OData protocol. Jeśli chcesz zrobić coś innego, na przykład punkt końcowy usługi REST, dziedziczy po ApiController.

Stosowanie niektórych elementów struktury ODAP WebAPI, ale nie innych, prawdopodobnie nie jest dobrym pomysłem. Może w niektórych przypadkach, ale prawdopodobnie nie będzie dobrze działać w innych. Na przykład możesz uzyskać obsługę zapytań, ale punkt końcowy $ metadata może nie zostać wygenerowany (to tylko spekulacja, rzeczywiste symptomy mogą być różne).

Wygląda na to, że używasz już EntityFramework. Wiem, że istnieje wiele próbek pokazujących, jak odsłonić to jako punkt końcowy OData.

Jeśli nie chcesz tego zrobić z jakiegoś powodu, możesz samodzielnie przeprowadzić kwerendę. Zostało to krótko omówione w kilku miejscach na stronie this tutorial, ale istotą jest dodanie do działania parametru o typie ODataQueryOptions<T> i skorzystanie z metod na nim do filtrowania zestawu wyników. Jednak generowanie dobrych zapytań do bazy danych dla wszystkich możliwych zapytań OData może być bolesne, więc powinieneś tego unikać, jeśli to możliwe.

+0

Dzięki. Zmieniłem treść mojego pytania. Mam nadzieję, że stało się bardziej jasne. –

+0

Myślę, że może to być dobry pomysł, jeśli oddzielisz kontrolery w ich własnym katalogu. Tak jak utworzyć folder API i folder OData w folderze Kontrolery. Jedną z zalet korzystania z OData jest to, że nie musisz tworzyć nowych zakodowanych zapytań linq dla każdego żądanego elementu; jest bardzo przydatny do wysyłania zapytań do pojedynczego obiektu (nie do połączonych podmiotów). Automatyczny adres URL zapytania generuje dla ciebie wyrażenie linq. Eliminując potrzebę dodawania nowych zapytań linq, unikasz konserwacji kodu i kosztów ogólnych projektu. – sksallaj

+1

Użyłbym APIController dla złożonych relacji zjednoczonych encji i OData dla prostych relacji pojedynczych encji. – sksallaj