2012-08-25 9 views
26

Si uso los proveedores de tipo F # del ensamblado FSharp.Data.TypeProviders 4.3.0.0, puedo crear tipos en una biblioteca F # muy simple. Entonces puedo usar esos tipos sin ninguna dependencia en el ensamblado FSharp.Data.TypeProviders. Eso es muy dulce! Aquí hay un ejemplo:¿Cómo creo un proveedor de tipo F # que pueda usarse desde C#?

Creé un proyecto de biblioteca F # llamado TryTypeProviders. Pongo esto en los .fs:

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

entonces soy capaz de usar la # biblioteca F de un proyecto de C#:

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

no he podido encontrar ningún ejemplo práctico de cómo crea un tipo de proveedor como este. No se puede acceder a los proveedores de tipos en FSharpx.TypeProviders desde C#. Supongo que se trata de tipos borrados y no generados. Todavía estoy un poco borrosa en la que es el que, pero es defined here as:

  1. tipos generados son tipos de .NET reales que se incrustan en el conjunto que utiliza el proveedor de tipo (esto es lo que los proveedores de tipo que se envuelven herramientas de generación de código como el uso de sqlmetal)
  2. Los tipos borrados son tipos simulados que están representados por algún otro tipo cuando se compila el código.

Las muestras del F# 3.0 Sample Pack mencionadas en MSDN tutorial no funcionan para mí. Construyen, pero cuando trato de usarlos obtengo errores.

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

Se último lanzado en marzo de 2011 y mi conjetura es que todavía no reflejan la versión final de los proveedores de tipo suministrada con Visual Studio 2012.

F Proveedores # Tipo ven como una gran tecnología, pero necesitamos ayuda para construirlos. Cualquier ayuda es apreciada.

Respuesta

36

La razón por la cual los proveedores de tipo estándar (para OData, LINQ to SQL y WSDL) funcionan con C# es que generan tipos de .NET reales detrás de la portada. Esto se llama proveedor de tipo generativo. De hecho, simplemente llaman a la herramienta de generación de código que se llamaría si estuviera usando estas tecnologías de C# de forma estándar. Entonces, estos tipos de proveedores son solo envoltorios sobre algunas herramientas .NET estándar.

La mayoría de los proveedores que se han escrito recientemente están escritos como que borran los proveedores de tipo. Esto significa que solo generan tipos "falsos" que le dicen al compilador F # a qué miembros se les puede llamar (etc.) pero cuando el compilador los compila, los tipos "falsos" se reemplazan con algún otro código. Esta es la razón por la cual no puede ver ningún tipo cuando usa la biblioteca desde C# - ninguno de los tipos existe realmente en el código compilado.

A menos que esté envolviendo el generador de código existente, es más fácil escribir proveedor de tipo borrado y la mayoría de los ejemplos están escritos de esta manera. Los proveedores de tipos de borrado tienen otros beneficios, es decir, pueden generar una gran cantidad de tipos "falsos" sin generar conjuntos excesivamente grandes.

De todos modos, hay una breve nota "Providing Generated Types" in the MSDN tutorial, que tiene algunos consejos para escribir proveedores generativos. Sin embargo, esperaría que la mayoría de los nuevos proveedores de tipo F # se escriban como borrados.Toma nota de que debe tener un ensamblado .NET real (con los tipos generados) y que los ayudantes F # no simplifiquen para los proveedores de tipo de construcción, por lo que deberá emitir el IL para el ensamblaje o generar el código C#/F # y compilar eso (es decir, utilizando CodeDOM o Roslyn).

+1

como minúsculas muestras de proveedores de tipo generativo que se pueden examinar en el conjunto de pruebas de ProvidedTypes API en Codeplex (http://fsharp3sample.codeplex.com/) – desco

+4

Gracias Tomas, eso definitivamente me ayudó a entender los tipos de proveedores. Logré que un proveedor de tipo generativo trabajara en VS 2012. Pude usarlo para crear tipos en una biblioteca F # y usar esa biblioteca desde una aplicación C#. Todo el código está en GitHub e hice una publicación en el blog para documentar algunas cosas que aprendí en el camino: [http://blog.ctaggart.com/2012/08/how-do-i-create-f-type- provider-that.html] (http://blog.ctaggart.com/2012/08/how-do-i-create-f-type-provider-that.html) –

+0

[link] (http: // blendinsider. com/technical/available-now-blend-for-visual-studio-2012-2012-08-15 /) Hola. F # 3.0 Expert pg 468. Uso de VS '12 Pro. ¿Cuál es el estado de Fsharpx.TypePoviders.XAML con VS'12Pro? ¿Funciona solo con Express? ¿Pro y Express funcionan y juegan bien juntos? –

Cuestiones relacionadas