Как мне выставить глобальный словарь, объявленный в f #, в который будут добавлены элементы из разных модулей HttpModules? - PullRequest
1 голос
/ 17 апреля 2011

У меня есть словарь (форматеры), объявленный в следующем коде, в который будут добавлены элементы внутри нескольких модулей HttpModules.Как только те загружены, это не будет записано снова.Каков наилучший способ показать это, чтобы к нему можно было получить доступ с любого языка .NET?Я знаю, что это кажется неубедительным и выглядит так, как будто мне нужно, чтобы они просто реализовали ToString (), однако часть приложения требует, чтобы строки были в определенном формате, и я не хочу, чтобы клиентам приходилось реализовывать ToString () способом, специфичным длямое заявление.

module MappingFormatters
open System
open System.Collections.Generic

let formatters = new Dictionary<Type, obj -> string>();

let format item =

    let toDateTime (d:DateTime) =
        let mutable date = d;
        if (date.Kind) <> System.DateTimeKind.Utc then
            date <- date.ToUniversalTime()
        date.ToString("yyyy-MM-ddTHH:mm:00Z")

    let stripControlCharacters (str:string) =
        let isControl c = not (Char.IsControl(c))
        System.String( isControl |> Array.filter <| str.ToCharArray())

    let defaultFormat (item:obj) =
        match item with
        | :? string as str-> stripControlCharacters(str)
        | :? DateTime as dte -> toDateTime(dte)
        | _ -> item.ToString()

    let key = item.GetType();
    if formatters.ContainsKey(key) then
        formatters.Item(key) item
    else
        defaultFormat item

Ответы [ 2 ]

1 голос
/ 17 апреля 2011

Если вопрос только о языковом взаимодействии, то я думаю, что вы должны просто изменить тип с

Dictionary<Type, obj -> string>

на

Dictionary<Type, Func<obj, string> >

, и тогда вы должны быть в хорошей форме.

0 голосов
/ 18 апреля 2011

После исследования. Я решил создать тип с именем MappingFormatters для хранения метода добавления форматера. Клиент не должен вызывать его, но мой код F # будет. Я полагаю, что это позволит мне использовать общие соглашения f #, предоставляя возможность взаимодействия других языков .net с наименьшей путаницей.

module File1
open System


let mutable formatters = Map.empty<string, obj -> string>

let format (item:obj) = 

    let dateToString (d:DateTime) =
        let mutable date = d;
        if (date.Kind) <> System.DateTimeKind.Utc then
            date <- date.ToUniversalTime()
        date.ToString("yyyy-MM-ddTHH:mm:00Z")

    let stripCtrlChars (str:string) =
        let isControl c = not (Char.IsControl(c))
        System.String( isControl |> Array.filter <| str.ToCharArray())


    let key = item.GetType().AssemblyQualifiedName
    if Map.containsKey key formatters then
        Map.find key formatters item
    else
        match item with
        | :? DateTime as d -> dateToString d
        | _ -> stripCtrlChars (item.ToString())

let add (typ:Type) (formatter:obj -> string) =
    let contains = Map.containsKey
    let key = typ.AssemblyQualifiedName

    if not (formatters |> contains key) then
        formatters <- Map.add key formatter formatters

type MappingFormatters() = class
    let addLock = new obj()
    member a.Add (``type``:Type, formatter:Func<obj,string>) =
        lock addLock (fun () ->
            add ``type`` (fun x -> formatter.Invoke(x))
        )
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...