2011-03-24 57 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