2012-04-17 12 views
6

का उपयोग करके प्रकार उत्पन्न करने के लिए "कनवर्ट टूजनेटेड" सदस्य को कॉल करने की आवश्यकता कब है, मुझे Type Provider Tutorial के "जनरेट किए गए प्रकार" अनुभाग को समझने में कठिनाई हो रही है। ट्यूटोरियल निम्नलिखित विनिर्देश प्रदान करता है।मुझे एक प्रकार प्रदाता

"आपको रूट प्रदान किए गए रूट पर कनवर्ट टोजनेरेटेड भी कॉल करना होगा, जिसका नेस्टेड प्रकार जेनरेट किए गए प्रकारों का एक बंद सेट बनाते हैं। यह कॉल दिए गए प्रकार की परिभाषा और इसकी नेस्टेड प्रकार की परिभाषाओं को एक असेंबली में छोड़ देती है और प्रदान की गई सभी विधानसभा संपत्ति को समायोजित करती है उस असेंबली को वापस करने के लिए परिभाषाएं टाइप करें। असेंबली केवल तब उत्सर्जित होती है जब रूट प्रकार पर असेंबली प्रॉपर्टी पहली बार एक्सेस की जाती है। मेजबान एफ # कंपाइलर इस प्रॉपर्टी तक पहुंचता है जब यह प्रकार के लिए जेनरेटिव टाइप घोषणा करता है। "

मुझे नहीं पता कि ConvertToGenerated कॉल कहां रखना है और मैं असेंबली फ़ाइल नाम पैरामीटर की आवश्यकताओं पर निश्चित नहीं हूं। क्या कोई उदाहरण प्रदान कर सकता है? धन्यवाद।

+1

आपको अद्यतन को एक उत्तर के रूप में पोस्ट करना चाहिए। यह भविष्य के आगंतुकों के लिए सहायक होगा। – pad

उत्तर

4

एफ # टीम से कुछ मदद के बाद मैंने अपनी समस्या हल की। यह जो मैंने किया है।

namespace Types 

open System 
open System.Data 
open System.IO 
open System.Linq 
open System.Data.Linq 
open Microsoft.FSharp.Data.TypeProviders 
open Microsoft.FSharp.Linq 
open Microsoft.FSharp.TypeProvider.Emit 
open Microsoft.FSharp.Core.CompilerServices 

type DatabaseSchema = 
    SqlDataConnection<"Data Source=(local);Initial Catalog=Test;Integrated Security=SSPI;"> 

[<TypeProvider>] 
type public MeasureTypeProvider(cfg:TypeProviderConfig) as this = 
inherit TypeProviderForNamespaces() 

let assembly = System.Reflection.Assembly.GetExecutingAssembly() 
let typesNamespace = "Types.Domain" 
let providedTypeBuilder = ProvidedTypeBuilder.Default 
let db = DatabaseSchema.GetDataContext() 

let types = 
    query { for m in db.Table do select m } 
    |> Seq.map(fun dataEntity -> 
        let className:string = dataEntity.Identifier 
        let providedTypeDefinition = 
          ProvidedTypeDefinition(className = className, 
                baseType = Some typeof<obj>, 
                IsErased=false) 
        providedTypeDefinition.AddMember(
           ProvidedConstructor([], InvokeCode = fun [] -> <@@ obj() @@>)) 
        providedTypeDefinition 
       ) |> Seq.toList 

let rootType = 
    let providedTypeDefinition = 
      ProvidedTypeDefinition(assembly, 
            typeNamespace, 
            "DomainTypes", 
            Some typeof<obj>, 
            IsErased=false) 
    providedTypeDefinition.AddMembersDelayed(fun() -> types) 
    this.AddNamespace(typesNamespace, [providedTypeDefinition]) 
    providedTypeDefinition 

let path = Path.GetDirectoryName(assembly.Location) + @"\GeneratedTypes.dll" 
do rootMeasureType.ConvertToGenerated(path) 

[<assembly:TypeProviderAssembly>] 
do() 

टाइपप्रोवाइडर। फ्रेम फ्रेम स्वचालित रूप से जेनरेट की गई असेंबली को साफ़ करता है। यदि आप इसे चारों ओर चिपकाना चाहते हैं तो निम्न कथन पर टिप्पणी करें।

File.Delete assemblyFileName 

एक अन्य पकड़ लिया मैंने पाया कि जब मैं प्रकार है कि मूल्य प्रकार से निकाले जाते हैं प्रदान करने में सक्षम था (दशमलव) की तरह जब IsErased = सच है, मैं नहीं जब IsErased = false इन व्युत्पन्न प्रकार प्रदान करने में सक्षम था। ऐसा इसलिए है क्योंकि मूल्य प्रकारों को बंद कर दिया गया है, इसलिए एक "वास्तविक" प्रकार उत्पन्न करना संभव नहीं है जो किसी मान प्रकार से प्राप्त होता है।

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