2011-10-25 12 views
5

więc jestem uczę F #, a wyglądało na to:Jak F Providers # typ kontroli typów w czasie kompilacji

F# type providers, how do they work

a to:

http://msdn.microsoft.com/en-us/library/hh361033(v=vs.110).aspx

jestem niezbyt płynny w języku F #, ale moim (prawdopodobnie niepełnym) zrozumieniem jest to, że dostawcy typów mają na celu zapewnienie pewnego rodzaju bezpiecznego dla statycznego dostępu do zewnętrznych źródeł danych.

Jak to się dzieje? Ponieważ źródło danych jest zewnętrzne, wydaje mi się, że nie ma możliwości sprawdzenia schematu źródła danych, który nie jest w stanie go wysłać, a zapytanie o rzeczy podczas kompilacji (i dla uzupełnienia kodu!) Wydaje się złym pomysłem.

Jeśli tego nie zrobią, musi być pewne rzutowanie, aby przesłać nieznane źródło danych do jakiegoś schematu (który może być następnie sprawdzony), co może ulec awarii, jeśli źródło danych nie można rzucić.

Odpowiedz

7

zadać kilka dobrych pytań:

  1. Czy usługodawca rodzaj kontaktu zewnętrznego źródła danych podczas kompilacji?

    Tak. Podstawową ideą dostawców w przestrzeni nazw FSharp.Data.TypeProviders jest to, że każdy z nich zawija generator kodu. Aby zrobić to samo w C# lub w większości innych języków, będziesz miał wyraźny krok generowania kodu (kontaktowanie się ze źródłem danych w/przed "czasem kompilacji"). W języku F # proces jest nieco bardziej bezproblemowy, ale z zasady bardzo podobny. Źródła danych, do których uzyskują dostęp dostawcy typów, udostępniają relatywnie wydajne sposoby sprawdzania schematu, a dostawcy typów zawierają logikę, aby zminimalizować liczbę cykli w trakcie kompilacji.

  2. Co się stanie, jeśli schemat się zmieni, lub baza danych nie działa lub ...?

    Ogólnie rzecz biorąc, zależy to od dostawcy typu, ale wbudowani dostawcy typów wystawiają użytkownikom kilka opcji. W szczególności można wskazać, że dostawca powinien buforować lokalną kopię schematu na wypadek, gdyby baza danych stała się niedostępna (alternatywnie można również zmusić dostawcę do działania w oparciu o dane na żywo, dzięki czemu błędy są zgłaszane podczas kompilacji natychmiast, jeśli wystąpi niezgodność).

    Ponownie, nie różni się to zbytnio od podejścia do generowania kodu w innych językach - jeśli schemat zmienia się spod Ciebie, możesz szybko się zawieść (jeśli zregenerujesz kod i odniesienia do wygenerowanego kodu przestaną ustaw się zgodnie z oczekiwaniami), lub możesz próbować się pomieszać (np. nie regenerując kodu i licząc na to, że wszystko się ułoży w czasie wykonywania).

Odpowiedzi te mają zastosowanie do wbudowanych dostawców, ale jako dostawca-pisarza z pewnością ktoś może zdecydować się zrobić coś innego (chociaż myślę, że podejście to ja przedstawił sens dla większości zewnętrzne źródła danych).

+1

Wierzę, ale nadal trudno w to uwierzyć. Oznacza to, że Visual Studio będzie faktycznie wysyłać żądania HTTP i kwerendy bazy danych i wszystkie te rzeczy podczas procesu kompilacji (i zakończenia kodu) w celu uzyskania schematu? Programowałem przez jakiś czas i nie sądzę, że widziałem takie rzeczy gdziekolwiek indziej; Zwykle w interfejsie z zewnętrznymi magazynami danych zawsze istnieje niejawna obsada.Czy gdziekolwiek mogę znaleźć tę koncepcję dla ogólnego przypadku, a nie dla F #? –

+5

Oglądaj około 3 minuty: http://channel9.msdn.com/events/BUILD/BUILD2011/SAC-904T od 25:30. Tak, gdy naciśniesz "." w środowisku IDE program Visual Studio wysyła żądania sieciowe w celu pobrania kolejnego fragmentu schematu w celu przedstawienia automatycznego uzupełniania IntelliSense. To może być powieść i jest całkiem fajnie :) – Brian