所以我正在学习F#,看着这个:
F# type providers, how do they work
和此:
http://msdn.microsoft.com/en-us/library/hh361033(v=vs.110).aspx
我对F#不是很流利,但我(可能不完整)的理解是,类型提供程序旨在为您提供某种对外部数据源的静态类型安全访问。
然而,他们是如何做到这一点的?由于数据源是外部的,似乎(对我来说)无法检查数据源的模式而不查询它,并且在编译期间(以及代码完成!)查询内容似乎是一个坏主意。
但是,如果他们不这样做,则必须进行一些强制转换,将未知数据源转换为某个模式(然后可以进行类型检查),如果数据源可以,则可能会失败不能铸造。
答案 0 :(得分:7)
你问了几个好问题:
类型提供程序在编译期间是否与外部数据源联系?
是。 FSharp.Data.TypeProviders命名空间中提供程序的基本思想是它们每个都包装一个代码生成器。因此,要在C#或大多数其他语言中执行相同的操作,您需要一个明确的代码生成步骤(在“编译时”之前/之前联系数据源)。在F#中,这个过程更加无缝,但原则上非常相似。类型提供程序访问的数据源公开了查询模式的相对有效的方法,类型提供程序包含在编译期间最小化往返次数的逻辑。
如果架构发生变化,或者数据库脱机,或者......?
会发生什么一般来说,这取决于类型提供程序,但内置类型提供程序向用户公开了一些选项。特别是,可以指示提供程序应该缓存模式的本地副本,以防数据库变得不可访问(或者,也可以强制提供程序违反实时数据,以便在编译期间立即报告错误,如果任何不匹配都会发生。)
同样,这与其他语言中的代码生成方法没有什么不同 - 如果架构从您下面更改,您可能会快速失败(如果重新生成代码并且对生成的代码的引用不再是行正如预期的那样),或者你可以尝试混淆(例如,从不重新生成代码并希望事情在运行时排列)。
这些答案适用于内置提供程序,但作为提供者 - 编写者,当然可以选择做一些不同的事情(尽管我认为我概述的方法对大多数外部数据源都有意义)。