Sto lavorando alla creazione di un sito Web utilizzando il modello F # MVC 5 e ho notato che il creatore del modello utilizza tipi dichiarati formalmente per i valori predefiniti del percorso. In VB.Net e C #, questo è tipicamente fatto con classi anonime, ma queste non esistono in F # il mio attuale lavoro è di usare un oggetto Expando, come questo:
[<RequireQualifiedAccess>]
module RouteConfig =
let private createDefaults (propValuePairs : seq<string * obj>) : obj =
let defaults = ExpandoObject() :> IDictionary<string,obj>
propValuePairs |> Seq.iter (fun (key,value) -> defaults.Add(key,value) )
box defaults
/// create a pair, boxing the second item
let inline private (=>) (key : string) value = key, box value
let RegisterWebApi =
Action<_> (fun (config: HttpConfiguration) ->
// Configure routing
config.MapHttpAttributeRoutes()
config.Routes.MapHttpRoute(
"DefaultApi", // Route name
"api/{controller}/{id}", // URL with parameters
createDefaults [ "controller" => "{controller}";
"id" => RouteParameter.Optional]
) |> ignore
// Configure serialization
config.Formatters.XmlFormatter.UseXmlSerializer <- true
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver
<- Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
// Additional Web API settings
)
let RegisterRoutes(routes:RouteCollection) =
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
createDefaults [ "controller" => "Home" ;
"action" => "Index";
"id" => UrlParameter.Optional; ]
) |> ignore
Mi sto principalmente chiedendo se i provider di tipi possono fare qualcosa di simile in fase di compilazione anziché in runtime.