2011-10-25 30 views
5

Vì vậy, tôi đang học F #, và nhìn này:Làm thế nào để F # Loại nhà cung cấp kiểm tra các loại tại thời gian biên dịch

F# type providers, how do they work

và điều này:

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

Tôi không thông thạo F #, nhưng sự hiểu biết của tôi (có thể không hoàn chỉnh) là các Nhà cung cấp Loại có nghĩa là cung cấp cho bạn một số loại truy cập an toàn kiểu tĩnh đến các nguồn dữ liệu bên ngoài.

Tuy nhiên, làm cách nào để thực hiện việc này? Vì nguồn dữ liệu ở bên ngoài, có vẻ như (đối với tôi) không có cách nào kiểm tra lược đồ nguồn dữ liệu không truy vấn nó và truy vấn công cụ trong thời gian biên dịch (và để hoàn thành mã!) Có vẻ như là một ý tưởng tồi. Tuy nhiên, nếu họ không làm điều đó, phải có một số quá trình truyền diễn ra để truyền nguồn dữ liệu không xác định vào một số lược đồ (sau đó có thể kiểm tra kiểu) có khả năng thất bại nếu nguồn dữ liệu không thể được đúc.

Trả lời

7

Bạn hỏi một vài câu hỏi hay:

  1. Liệu các nhà cung cấp loại tiếp xúc các nguồn dữ liệu bên ngoài trong quá trình biên soạn?

    Có. Ý tưởng cơ bản của các nhà cung cấp trong không gian tên FSharp.Data.TypeProviders là chúng bao bọc một trình tạo mã. Vì vậy, để làm điều tương tự trong C# hoặc hầu hết các ngôn ngữ khác, bạn sẽ có một bước tạo mã rõ ràng (liên hệ với nguồn dữ liệu tại/trước "thời gian biên dịch"). Trong F #, quá trình này là một chút liền mạch hơn nhưng rất giống nhau về nguyên tắc. Các nguồn dữ liệu được truy cập bởi các nhà cung cấp kiểu hiển thị các cách tương đối hiệu quả để truy vấn lược đồ, và các nhà cung cấp loại chứa logic để giảm thiểu số lượng các chuyến đi khứ hồi trong quá trình biên dịch.

  2. Điều gì sẽ xảy ra nếu lược đồ thay đổi hoặc cơ sở dữ liệu không trực tuyến hoặc ...?

    Nói chung, điều này tùy thuộc vào nhà cung cấp loại, nhưng nhà cung cấp loại được tích hợp sẵn hiển thị một vài tùy chọn cho người dùng. Cụ thể, có thể chỉ ra rằng nhà cung cấp nên lưu trữ một bản sao cục bộ của lược đồ trong trường hợp cơ sở dữ liệu không thể truy cập được (cách khác, nó cũng có thể buộc nhà cung cấp phải đối đầu với dữ liệu trực tiếp, để lỗi được báo cáo trong quá trình biên dịch ngay lập tức nếu bất kỳ sự không khớp nào xảy ra).

    Một lần nữa, điều này không quá khác với cách tiếp cận tạo mã bằng các ngôn ngữ khác - nếu lược đồ thay đổi từ bên dưới bạn, bạn có thể thất bại nhanh (nếu bạn tạo lại mã và tham chiếu đến mã được tạo không còn nữa xếp hàng như mong đợi), hoặc bạn có thể cố gắng lộn xộn thông qua (ví dụ bằng cách không bao giờ tái tạo mã và hy vọng rằng những thứ xếp hàng tại thời gian chạy).

Những câu trả lời áp dụng đối với các nhà cung cấp tích hợp, nhưng như một nhà cung cấp-nhà văn một người nào đó chắc chắn có thể chọn để làm một cái gì đó khác nhau (mặc dù tôi nghĩ rằng phương pháp mà tôi đã vạch ra có ý nghĩa đối với đa số bên ngoài nguồn dữ liệu).

+1

Tôi tin bạn, nhưng vẫn thấy khó tin. Điều này có nghĩa là Visual Studio sẽ thực sự gửi các yêu cầu và truy vấn cơ sở dữ liệu http và tất cả những thứ này trong quá trình biên dịch (và hoàn thành mã) để thu được lược đồ? Tôi đã lập trình được một thời gian và tôi không nghĩ rằng tôi đã nhìn thấy loại điều này được thực hiện ở bất kỳ nơi nào khác; thông thường luôn có một diễn viên tiềm ẩn tại giao diện với kho dữ liệu bên ngoài.Có bất cứ nơi nào tôi có thể tìm kiếm khái niệm này cho trường hợp chung, không cụ thể cho F #? –

+5

Xem khoảng 3 phút sau: http://channel9.msdn.com/events/BUILD/BUILD2011/SAC-904T bắt đầu lúc 25:30. Có, khi bạn nhấn '.' trong IDE, Visual Studio đang gửi các yêu cầu web để tìm nạp một phần khác của lược đồ để trình bày tự động hoàn thành Intellisense. Nó có thể là cuốn tiểu thuyết, và nó là khá tuyệt vời :) – Brian

Các vấn đề liên quan