2012-12-07 29 views
28

Các nhà cung cấp loại F # 3.0 mới có thể được sử dụng để kết nối không khớp giữa các kiểu dữ liệu F # hoặc các lớp và cấu trúc nguồn dữ liệu như XML hoặc WSDL. Tuy nhiên sự không phù hợp này cũng là một thách thức trong các ngôn ngữ .NET khác như C#.Các nhà cung cấp loại F # có thể được kết hợp trong C#

Tôi muốn sử dụng nhà cung cấp F # 3.0 trong mã C#. Làm thế nào tôi có thể làm điều này, nếu có? Hơn nữa, nếu chúng ta không thể, việc thực hiện C# cần có khả năng sử dụng chúng là gì?

+1

Điều này phải ở dạng wiki cộng đồng. Tôi tin rằng nó sẽ châm ngòi cho những cuộc thảo luận khá dài. –

Trả lời

9

Một số khía cạnh về cách nhà cung cấp loại hoạt động được đặc biệt phù hợp với nhu cầu của các lập trình viên F #, nhưng có thể ít hấp dẫn hơn khi xem xét các giải pháp truy cập dữ liệu mạnh mẽ cho các ngôn ngữ khác. Ví dụ, rất nhiều lập trình F # được thực hiện trong F # Interactive và các nhà cung cấp kiểu cho phép luồng công việc này rất độc đáo so với các trình tạo mã (yêu cầu cơ chế bên ngoài ngôn ngữ để tạo các tệp mã nguồn). Vì các lập trình viên C# được sử dụng cho các chu kỳ biên dịch chạy biên dịch chậm hơn, điều này có thể ít quan trọng hơn trong cài đặt C#.

Từ góc độ kỹ thuật, tôi nghi ngờ suy luận kiểu phổ biến hơn của F # có lẽ là lợi thế lớn nhất so với các ngôn ngữ như C#. Ví dụ, nếu tôi muốn quấn một số logic truy cập dữ liệu từ một nhà cung cấp loại trong loại khác, tôi có thể làm một cái gì đó như thế này:

let moviesStartingWith prefix = 
    query { 
     for movie in MyDataSource.Movies do 
     where (movie.Title.StartsWith(prefix) } 
    |> Seq.toList 

Trong C#, tôi cần phải xác định kiểu trả về (ví dụ List<DataSource.ServiceTypes.Movie>) mà kết thúc là một việc vặt, và điều đó có nghĩa là ngay cả với IntelliSense, tôi đang nằm rải rác thông qua tập hợp các loại được cung cấp để tạo chữ ký ngoài việc nằm rải rác thông qua tập các giá trị được cung cấp để tạo truy vấn. Tất nhiên, điều này cũng áp dụng cho các khu vực khác ngoài nhà cung cấp loại, nhưng tôi nghĩ rằng với một số hệ thống phân cấp kiểu lồng nhau được tạo tự nhiên bởi một số nhà cung cấp, điều này đặc biệt gây đau đớn. cực kỳ dài.

+2

Suy luận loại C# có thể tốt hơn bạn cho tín dụng. Thậm chí nếu đây là một phương thức thay vì một câu lệnh nội tuyến, người ta có thể đặt một tham số kiểu trên chữ ký phương thức và hành động truyền vào trong 'MyDataSource.Movies' sẽ ràng buộc tham số kiểu mà không cần chỉ định kiểu đã đóng, và rời khỏi kiểu trả về 'Danh sách '. – codekaizen

24

Tôi nghĩ @kvb đưa ra tổng quan tốt về một số khó khăn về kỹ thuật. Tôi đồng ý suy luận loại sẽ có vấn đề - về cơ bản bạn sẽ bị hạn chế sử dụng các loại nhà cung cấp được tạo cục bộ, tương tự như các loại ẩn danh. Tôi nghĩ C# có thể có thứ gì đó tương tự như Roslyn, nhưng tôi nghi ngờ nó sẽ được tích hợp một cách tao nhã và trơn tru như trong F # (nơi các nhà cung cấp kiểu thực tế là tính năng ngôn ngữ và không chỉ là công cụ ).

Để trả lời hai câu hỏi cụ thể của bạn:

[Làm thế nào tôi có thể] sử dụng F # 3.0 cung cấp trong C# mã?

Nhà cung cấp loại F # thực sự chỉ được hiểu bởi trình biên dịch F #, vì vậy bạn sẽ cần phải sử dụng chúng từ F #. Đối với các nhà cung cấp loại generative (SQL, thực thể, WSDL, tệp cấu hình), bạn có thể tham khảo nhà cung cấp từ F # và sử dụng các loại được tạo từ dự án C#.

Để xóa xóa nhà cung cấp loại, bạn không thể thực hiện việc này, vì loại không thực sự tồn tại và chỉ F # mới có thể xem chúng. Vì vậy, lựa chọn tốt nhất là viết mã xử lý của bạn trong F # và trả lại kết quả dưới dạng bộ sưu tập các bản ghi hoặc các loại khác có thể dễ dàng được tiêu thụ từ C#.

Việc triển khai C# cần có khả năng sử dụng chúng là gì?

Tôi có thể, tất nhiên, chỉ cần nói "C# sẽ phải hỗ trợ nhà cung cấp loại!", Nhưng đây là một số suy nghĩ khác. Loại nhà cung cấp chỉ là hội đồng .NET và họ không sử dụng bất kỳ loại F # cụ thể nào. Các ITypeProvider interface có thể được tiêu thụ bởi bất kỳ ngôn ngữ .NET bao gồm C#, vì vậy nếu C# thiết kế muốn, họ có thể tái sử dụng tất cả các nhà cung cấp lớn đã được xây dựng cho F #.

Vì vậy, hãy gửi đề xuất này đến C# user voice hoặc ủng hộ nó ở nơi khác (hoặc thuyết phục nhóm Mono thực hiện điều này!) Và có lẽ nó sẽ được thêm vào C# (vNext + 1 + ...). Bây giờ, bạn sẽ chỉ nhận được tất cả các lợi ích trong F #.

+0

Cảm ơn bạn đã phản hồi rất tốt. Tôi không chắc chắn rằng tôi hoàn toàn hiểu được sự khác biệt giữa các nhà cung cấp loại generative và erasing. Tôi có thể tìm thêm thông tin về chủ đề này ở đâu? Tôi đoán nhà cung cấp loại Ngân hàng Thế giới là một ví dụ về nhà cung cấp loại xóa. Nhưng làm thế nào về một nhà cung cấp loại CSV. Nó cũng là một nhà cung cấp loại tẩy xoá? – carstenj

+0

"Vì vậy, lựa chọn tốt nhất là viết mã xử lý của bạn trong F # và trả lại kết quả dưới dạng bộ sưu tập các bản ghi hoặc các loại khác có thể dễ dàng được tiêu thụ từ C#." Bạn có bất kỳ ví dụ mã nào về điều này không? –

+0

@Nameless Tôi đã làm một video Pluralsight về điều này: https://www.pluralsight.com/courses/accessing-data-fsharp-type-providers Nó thực sự có sẵn miễn phí trong 2 ngày tới hoặc lâu hơn (nhưng bạn nên cũng có thể dùng thử miễn phí sau này). –

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