Obecnie istnieją inne główne różnice między usługami WebApi i WCF Data Services, o których nikt nigdy nie wspomina. Chciałbym, żeby stwardnienie rozsiane wyszło z dobrym artykułem porównującym te dwa.
Od jakiegoś czasu śledzę OData, a także WebApi. Zawsze znajdowałem kilka głównych wyróżnień.
Po pierwsze, nie jestem pewien, co twój szef ma na myśli mówiąc „MS wspiera WebApi”, co oznacza, że nie wspierają OData? IMO, popierają oba te rozwiązania i obecnie w minimalnym stopniu się pokrywają. Windows Azure Data Market udostępnia swoje dane za pomocą OData, Azure Table Storage korzysta z OData, SharePoint 2010 zezwala na zapytania OData na swoich danych, a inne produkty firmy MS również je obsługują, takie jak Excel PowerPivot. Jest to bardzo potężny framework zapytań, jeśli chodzi o dane relacyjne. A ponieważ jest to RESTful, można z nim zintegrować dowolny język, framework, urządzenie itp.
Oto, co lubię w usługach danych OData + WCF:
Usługi danych OData + WCF wreszcie umożliwiły aplikacjom klienckim bardziej „ekspresyjne” wykonywanie zapytań dotyczących danych w sieci Web. Wcześniej zawsze musieliśmy używać ASMX lub WCF do tworzenia sztywnych interfejsów API sieci Web, które stają się nieporęczne i wymagają ciągłych zmian, gdy interfejs użytkownika chce czegoś nieco innego. Aplikacja kliencka mogła jedynie określać parametry decydujące o tym, jakie kryteria mają zostać zwrócone. Albo zrób tak, jak ja i „Serializuj” wyrażenia LINQ i przekaż je jako parametry i ponownie nawadniaj Expressions<Func<T,bool>>
na serwerze. Jest przyzwoity. Wykonałem zadanie, ale chcę użyć LINQ na kliencie i przetłumaczyć go przez sieć WWW przy użyciu REST, co jest dokładnie tym, na co pozwala OData i nie chcę używać własnego „hackowania” rozwiązania.
To tak, jakby udostępniać „TRANSACT SQL” bez konieczności podawania parametrów połączenia z bazą danych. Po prostu podaj adres URL i whoala! Rozpocznij zapytanie. Oczywiście zarówno usługi WebApi, jak i usługi danych WCF obsługują uwierzytelnianie / autoryzację, dzięki czemu można kontrolować dostęp, dołączać dodatkowe instrukcje „Where” na podstawie ról lub innej konfiguracji danych. Wolałbym to zrobić w mojej warstwie Web Api niż w SQL (jak budowanie widoków lub przechowywanych procesów). A teraz, gdy aplikacje mogą same tworzyć zapytania, zobaczysz, że narzędzia Ad-Hoc i BI Reporting zaczynają wykorzystywać OData i pozwalają Użytkownikom definiować własne wyniki. Nie poleganie na raportach statycznych, gdzie mają minimalną kontrolę.
Podczas programowania w Silverlight, Windows 8 Metro lub ASP.NET (MVC, WebForms itp.) Możesz po prostu dodać „Service Reference” w programie Visual Studio do usługi danych WCF i szybko rozpocząć korzystanie z LINQ do wykonywania zapytań dotyczących danych ORAZ otrzymasz „Kontekst danych” na kliencie, co oznacza, że śledzi zmiany i umożliwia „przesłanie” zmian atomowo z powrotem na serwer. To bardzo podobne do usług RIA dla Silverlight. Korzystałbym z usług danych WCF zamiast usług RIA, ale w tamtym czasie nie obsługiwały one adnotacji danych ani akcji, ale teraz tak. od klienta. Może to pomóc w zwiększeniu wydajności, na wypadek, gdyby nie chcę zwracać wszystkich właściwości z jednostki. Posiadanie „kontekstu danych”
Tak więc usługi danych WCF są świetne, jeśli masz dane z relacjami, zwłaszcza jeśli używasz programu SQL Server i Entity Framework. Szybko będziesz w stanie udostępnić Queryable Data + Actions (wywołania do wywołania operacji, tj. Przepływy pracy, procesy w tle) przez REST z bardzo małą ilością kodu. Usługi danych WCF zostały właśnie zaktualizowane. Uruchomiono nową wersję. Sprawdź wszystkie nowe funkcje.
Wadą usług danych WCF jest „kontrola” tracona w stosie HTTP. Największą wadę znalazłem w IQueryable<T>
metodach zwracających kolekcje. W przeciwieństwie do usług RIA i WebApi NIE masz pełnego dostępu do tworzenia logiki w metodzie IQueryable. W usługach RIA i WebApi możesz pisać dowolny kod, o ile wrócisz IQueryable<T>
. W usługach danych programu WCF można uzyskać dostęp TYLKO do dołączania instrukcji „Where” przy użyciu Expression<Func<T,bool>>
metod przechwytujących. To mnie rozczarowało. Nasza obecna aplikacja korzysta z usług RIA i uważam, że naprawdę potrzebujemy możliwości kontrolowania logiki IQueryable. Mam nadzieję, że się mylę i po prostu czegoś mi brakuje
Ponadto usługi danych WCF nie obsługują jeszcze w pełni wszystkich operatorów LINQ. Jednak nadal obsługuje więcej niż WebApi.
A co z WebApi ???
- Podoba mi się kontrola nad żądaniem / odpowiedzią HTTP
- Jest łatwy do naśladowania (wykorzystując wzorce MVC). Jestem pewien, że pojawi się więcej narzędzi.
W chwili obecnej (w moim rozumieniu) nie ma obsługi „kontekstu danych” na kliencie (tj. Silverlight, kod po stronie serwera ASP.NET itp.), Ponieważ WebApi tak naprawdę nie dotyczy modeli danych encji, takich jak usługi danych WCF / OData jest. Może ujawniać kolekcje obiektów modelu przy użyciu IQueryable / IEnumerable, ale nie ma „właściwości nawigacji” klucza podstawowego / klucza obcego (tj. Faktur klienta) do użycia po załadowaniu jednostek do klienta, ponieważ nie ma „kontekstu danych” który ładuje je asynchronicznie (lub w jednym wywołaniu za pomocą $ expand) i zarządza zmianami. Nie masz wygenerowanej przez kod „reprezentacji” Entity Data Model na kliencie, tak jak w przypadku usług RIA lub usług danych WCF. Nie mówię, że nie możesz / nie masz modeli w kliencie, które reprezentują Twoje dane, ale musisz ręcznie wypełnić dane i zarządzać tym, które „faktury” mają być ustawione dla każdego „klienta” po ich pobraniu przez Internet. Może to być trudne, szczególnie w przypadku wszystkich rzeczy związanych z Async. Nie wiesz, które połączenia zostaną odebrane jako pierwsze. Może to być trudne do wyjaśnienia w tym miejscu, ale po prostu przeczytaj o rzeczy „Kontekst danych” w usługach RIA lubUsługi danych WCF . Więc kiedy mam do czynienia z linią aplikacji biznesowych, jest to dla mnie poważny problem. Opiera się to głównie na wydajności i łatwości konserwacji. Możesz tworzyć aplikacje bez kontekstu danych. To po prostu ułatwia pracę, szczególnie w Silverlight, WPF, a teraz w Windows 8 Metro. Posiadanie jednostek relacyjnych ładowanych do pamięci asynchronicznie i posiadanie dwóch powiązań jest naprawdę przyjemne.
Powiedziawszy to, czy to oznacza, że pewnego dnia WebApi może obsługiwać „kontekst danych” na kliencie? Myślę, że tak. Ponadto przy większej liczbie narzędzi projekt programu Visual Studio może generować wszystkie metody CRUD na podstawie schematu bazy danych (lub Entity Framework).
Wiem też, że wspominam tylko o .NET do .NET Framework, jeśli chodzi o pracę z usługami danych WCF lub WebApi, ale jestem bardzo świadomy, że HTML / JS jest również głównym graczem. Właśnie wspomniałem o korzyściach, które znalazłem podczas korzystania z interfejsu użytkownika Silverlight lub kodu po stronie serwera ASP.NET itp. Uważam, że wraz z pojawieniem się „IndexedDB” w HTML5 / JavaScript, który ma „Kontekst danych” i Struktura LINQ w języku JavaScript może również stać się dostępna, dzięki czemu możliwość wykonywania zapytań w usługach OData z poziomu JavaScript będzie jeszcze łatwiejsza (można dziś używać DataJS z OData). Ponadto użycie KnockoutJS do obsługi MVVM i Binding w HTML / JS sprawi, że będzie to proste :)
Obecnie szukam platformy, której mam użyć. Byłbym szczęśliwy z jednego z nich, ale skłaniam się ku OData ze względu na fakt, że moja następna aplikacja dotyczy głównie Analytics (tylko do odczytu) i chcę bogatego, ekspresyjnego interfejsu API RESTful. Wierzę, że OData + WCF Data Services daje mi to, ponieważ WebApi obsługuje tylko $ take, $ skip, $ filter, $ orderby w przypadku kolekcji. NIE obsługuje projekcji, zawiera ($ expand) itp. Nie mam wielu „aktualizacji / usunięć / wstawień”, a nasze dane są dość relacyjne.
Mam nadzieję, że inni dołączą do dyskusji i podzielą się swoimi przemyśleniami. Nadal decyduję i chciałbym poznać inne opinie. Naprawdę uważam, że oba te frameworki są świetne. Zastanawiam się, czy musisz w ogóle wybierać, dlaczego nie użyć obu w razie potrzeby. Od klienta i tak chodzi o budowanie połączeń REST. Tylko myśl :)