2011-03-24 15 views
0

我試圖實現單例模式,但收到錯誤。我的實現看起來功能上與this answerthis one相同。我使用的是類而不是模塊,因爲它實現了一個接口。實現單例模式時出錯(在相互遞歸類型中)

type SystemObjectFactory private() = 
    static let instance = lazy (SystemObjectFactory()) 
    static member Instance = instance.Value //ERROR 

唯一的例外是:

System.InvalidOperationException:一個文件或類型的靜態初始化導致的靜態數據進行遞歸訪問它完全初始化之前。

我該如何解決這個問題?

作爲一個方面說明,我不知道爲什麼下面的(我喜歡)無法正常工作或:

type SystemObjectFactory private() = 
    static let instance = SystemObjectFactory() 
    static member Instance = instance 

UPDATE

我可能已經發現了這個問題。這個類正在從一個相互遞歸類型的靜態構造函數中引用。顯然,這是.NET中黑暗和禁止的魔法。

更多背景:

type Entity() = 
    static do 
     Bootstrapper(SystemObjectFactory.Instance).Init() //PURE EVIL 

and SystemObjectFactory private() = 
    static let instance = SystemObjectFactory() 
    static member Instance = instance 

回答

2

在哪些方面您喜歡的版本無法正常工作?當我鍵入它FSI似乎工作:

> type SystemObjectFactory private() = 
    static let instance = SystemObjectFactory() 
    static member Instance = instance;; 

type SystemObjectFactory = 
    class 
    private new : unit -> SystemObjectFactory 
    static member Instance : SystemObjectFactory 
    end 

> SystemObjectFactory.Instance;; 
val it : SystemObjectFactory = FSI_0002+SystemObjectFactory 

更新

嘗試切換您的遞歸類型的順序!

type SystemObjectFactory private() = 
    static let instance = SystemObjectFactory() 
    static member Instance = instance 
and Entity() = 
    static do 
     SystemObjectFactory.Instance = SystemObjectFactory.Instance |> ignore //slightly evil 
+0

我更新了問題。我需要提供更多的背景......我認爲我發現了這個問題。現在,要弄清楚如何最好地重構... – Daniel 2011-03-24 19:53:16

+0

哈!那樣做了。現在它只是有點邪惡。謝謝。 – Daniel 2011-03-24 20:01:10

+0

不客氣!更新答案以反映惡意降級。 – 2011-03-24 20:06:29