[英]How should I expose the total record count and IEnumable collection of paged records from my service layer method?
[英]How should I expose a global Dictionary declared in f# that will have items added from different HttpModules?
我有一個在以下代碼中聲明的字典(格式化程序),該字典將在多個HttpModule中添加項。 一旦加載了這些,就不會再被寫入。 公開此內容以便可以從任何.NET語言訪問的最佳方法是什么? 我知道這似乎很la腳,看起來我應該讓他們實現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
如果問題只是關於語言互操作性的問題,那么我認為您應該將類型從
Dictionary<Type, obj -> string>
至
Dictionary<Type, Func<obj, string> >
然后您應該處於良好狀態。
經過研究。 我決定創建一個名為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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.