2012-08-25 12 views
26

यदि मैं असेंबली FSharp.Data.TypeProviders 4.3.0.0 से F # प्रकार प्रदाता का उपयोग करता हूं, तो मैं एक बहुत ही सरल F # लाइब्रेरी में प्रकार बनाने में सक्षम हूं। मैं फिर उन प्रकारों का उपयोग असेंबली FSharp.Data.TypeProviders पर निर्भरता के बिना कर सकता हूं। वह बहुत प्यारा है! यहां एक उदाहरण दिया गया है:मैं एक एफ # प्रकार प्रदाता कैसे बना सकता हूं जिसका उपयोग सी # से किया जा सकता है?

मैंने TryTypeProviders नामक एक F # लाइब्रेरी प्रोजेक्ट बनाया है। मैं .fs में रखते:

module TryTypeProviders 
type Northwind = Microsoft.FSharp.Data.TypeProviders.ODataService

मैं तो एक सी # परियोजना से एफ # लाइब्रेरी का उपयोग करने में सक्षम हूँ:

public static void Main() 
{ 
    var c = new TryTypeProviders.Northwind(); 
    foreach (var cust in c.Customers) 
     Console.WriteLine("Customer is: " + cust.ContactName); 
    Console.ReadKey(true); 
}

मैं करने के लिए कैसे के किसी भी काम के उदाहरण ढूँढने में सक्षम नहीं किया गया इस प्रकार एक प्रकार प्रदाता बनाएँ। FSharpx.TypeProviders में प्रकार प्रदाता C# से उपलब्ध नहीं हैं। मेरा अनुमान है कि वे मिटाए गए प्रकार हैं और उत्पन्न प्रकार नहीं हैं। मैं अब भी है जिस पर है थोड़े धुंधले कर रहा हूँ जो है, लेकिन यह defined here as है:

  1. जनरेट किया प्रकार वास्तविक नेट प्रकार है कि विधानसभा प्रकार प्रदाता का उपयोग करता है में एम्बेड मिलता है (यह है कि किस प्रकार प्रदाताओं कि चादर कोड उत्पादन उपकरण जैसे SQLमीटर उपयोग)
  2. मिटाए गए प्रकार नकली प्रकार हैं जिन्हें कोड संकलित करते समय किसी अन्य प्रकार द्वारा दर्शाया जाता है।

एमएसडीएन tutorial में उल्लिखित F# 3.0 Sample Pack के नमूने मेरे लिए काम नहीं कर रहे हैं। वे निर्माण करते हैं, लेकिन जब मैं उनका उपयोग करने की कोशिश करता हूं तो मुझे त्रुटियां मिलती हैं।

open Samples.FSharp.RegexTypeProvider
type PhoneNumberRegEx = CheckedRegexProvider< @"(?<AreaCode>^\d{3})-(?<PhoneNumber>\d{3}-\d{4}$)">
open Samples.FSharp.MiniCsvProvider
type csv = MiniCsvProvider<"a.csv">

यह पिछले 2011 के मार्च में जारी किया गया था और मेरा अनुमान है कि वे अभी तक उस दृश्य स्टूडियो 2012

एफ # टाइप प्रदाता देखने के साथ भेज दिया प्रकार प्रदाताओं के अंतिम संस्करण को प्रतिबिंबित नहीं करते है एक महान तकनीक की तरह, लेकिन हमें उन्हें बनाने में मदद की ज़रूरत है। किसी भी मदद की सराहना की है।

उत्तर

36

मानक प्रकार प्रदाता (ओडाटा, LINQ से SQL और WSDL के लिए) सी # के साथ काम करने का कारण यह है कि वे कवर के पीछे वास्तविक .NET प्रकार उत्पन्न करते हैं। इसे जनरेटिव प्रकार प्रदाता कहा जाता है। वास्तव में, वे केवल कोड जनरेशन टूल को कॉल करते हैं जिसे आप इन तकनीकों का उपयोग मानक तरीके से सी # से कर रहे थे। इसलिए, इन प्रकार के प्रदाता कुछ मानक .NET उपकरण पर केवल रैपर हैं।

नए लिखित नए प्रदाताओं को मिटाए गए प्रकार प्रदाताओं के रूप में लिखा गया है। इसका मतलब है कि वे केवल "नकली" प्रकार उत्पन्न करते हैं जो एफ # कंपाइलर को बताते हैं कि सदस्यों को क्या कहा जा सकता है (आदि) लेकिन जब संकलक उन्हें संकलित करता है, तो "नकली" प्रकार किसी अन्य कोड के साथ प्रतिस्थापित होते हैं। यही कारण है कि आप किसी भी प्रकार को नहीं देख सकते हैं जब आप सी # से लाइब्रेरी का उपयोग कर रहे हैं - संकलित कोड में वास्तव में मौजूद कोई भी प्रकार मौजूद नहीं है।

जब तक आप मौजूदा कोड जनरेटर को लपेट नहीं रहे हैं, तो मिटाए गए प्रकार प्रदाता लिखना आसान है और इसलिए अधिकांश उदाहरण इस तरह से लिखे गए हैं। मिटाने वाले प्रकार प्रदाताओं के पास अन्य फायदे हैं - यानी वे अत्यधिक बड़ी असेंबली पैदा किए बिना बड़ी संख्या में "नकली" प्रकार उत्पन्न कर सकते हैं।

वैसे भी, एक संक्षिप्त नोट "Providing Generated Types" in the MSDN tutorial है, जिसमें जनरेटिव प्रदाताओं को लिखने पर कुछ संकेत हैं। हालांकि, मुझे उम्मीद है कि नए एफ # प्रकार प्रदाताओं को मिटाने के रूप में लिखा जाना चाहिए।यह नोट करता है कि आपके पास असली .NET असेंबली (जेनरेट किए गए प्रकारों के साथ) होनी चाहिए और इसे प्राप्त करने वाले प्रदाताओं के लिए F # सहायताकर्ताओं द्वारा इसे सरल नहीं बनाया जाना चाहिए - इसलिए आपको असेंबली के लिए आईएल उत्सर्जित करना होगा या सी #/एफ # कोड उत्पन्न करना होगा और संकलित करें (यानी CodeDOM या Roslyn का उपयोग कर)।

+1

जेनरेटिव टाइप प्रदाताओं के छोटे नमूने के रूप में कोई कोडप्लेक्स (http://fsharp3sample.codeplex.com/) – desco

+4

पर प्रोविडड टाइप्स एपीआई के परीक्षणों के सेट में देख सकता है, धन्यवाद टॉमस, जिसने निश्चित रूप से टाइप प्रदाताओं की मेरी समझ में मदद की। मैं वीएस 2012 में काम कर रहे एक जेनरेटिव टाइप प्रदाता को प्राप्त करने में सक्षम था। मैं इसे एफ # लाइब्रेरी में प्रकार बनाने के लिए उपयोग करने में सक्षम था, और उस लाइब्रेरी को सी # एप्लिकेशन से उपयोग करता हूं। सभी कोड गिटहब में हैं और मैंने ब्लॉग पोस्ट को कुछ चीजों को दस्तावेज करने के लिए बनाया है: [http://blog.ctaggart.com/2012/08/how-do-i-create-f-type- प्रदाता- that.html] (http://blog.ctaggart.com/2012/08/how-do-i-create-f-type-provider-that.html) –

+0

[लिंक] (http: // blendinsider। कॉम/तकनीकी/उपलब्ध-अब-मिश्रण-दृश्य-स्टूडियो -2012-2012-08-15 /) हाय। एफ # 3.0 विशेषज्ञ पीजी 468. वीएस '12 प्रो का उपयोग करना। VS'12Pro के साथ Fsharpx.TypePoviders.XAML की स्थिति क्या है? क्या यह केवल डब्ल्यू/एक्सप्रेस काम करता है? प्रो और एक्सप्रेस काम करो और अच्छी तरह से खेलते हैं? –

संबंधित मुद्दे

 संबंधित मुद्दे