F# アセンブリで log4net スタイルのインターフェイスを構築しようとしています。key 属性は、オブジェクトのインスタンスを返す静的メソッドを公開しています。log4net は、C# デリゲートを使用してタスクを実行しますLogManager.GetLogger("log123")
。私の理解では、デリゲートは、内向きの F# ライブラリのファースト クラスとしての関数よりも優先されません。
以下の単純化されたコードは目的を達成しますが、インスタンス化されたオブジェクトのマップを保持するために F# 参照セルを使用することに私は不快感を覚えます。私の不快感が正当化されるかどうかについてのフィードバックに興味があります。
namespace Test
[<Interface>]
type IMyIface =
abstract member Addi : int -> int
[<Sealed>]
type TheMainObject internal (x:int) =
let mutable sum = x
interface IMyIface with
member this.Addi(y:int) = sum <- sum + y; sum
module internal Wrapr =
let mymap = ref Map.empty
let mgr s =
let m = !mymap
if Map.containsKey s m then m.[s]
else
let x = new TheMainObject(0)
mymap := m.Add(s, x)
x
[<Sealed>]
type Mgr() =
static member Get(n:string) =
Wrapr.mgr n :> IMyIface
Program.fs は、上記のライブラリを次のように呼び出します。
open Test
let a = Mgr.Get("hello")
printfn "%d" (a.Addi(1))
let c = Mgr.Get("hello")
printfn "%d, %A" (c.Addi(3)) (a = c) //prints 4, true
コメントありがとうございます。