使用派生类访问单例实例失败

时间:2017-12-04 15:30:10

标签: c#

我有一个这样的数据库包装代码(伪代码):

class MyDBWrapper<objecttype> : Singleton
{
    private DBDriver _Driver

    Driver => Instance._Driver; 

    ... tons of static functionality here referencing the driver
}

然后我可以从它创建自定义数据库:

class ObjectA_DB : MyDBWrapper<ObjectA_Type>
{
    ... all my calls using the static functionalities of the base class
}

这很有效......

现在,出现了另一种情况:

我有一个通用对象:BaseObject 和一堆派生对象:ObjectA,ObjectB等

并且它们都需要相同的数据库代码,所以我这样做了:

class MyGenericDB<T> : MyDBWrapper<T> where T : BaseObject
{
    .. common functionality
} 

然后实例化类型特定的类,如下所示:

class MyTypeA_DB : MyGenericDB<ObjectA_Type>
class MyTypeB_DB : MyGenericDB<ObjectB_Type>

并且这可以正确编译,但是当我尝试访问实例时,单例代码会导致问题 因为它似乎正在递归。 Visual Studio无法对发生的事情给出正确的错误,但它会挂起然后崩溃,所以我猜测堆栈溢出。

单身代码在这里:

public abstract class Singleton<T> where T : class
{
    private static readonly Lazy<T> _Instance = new Lazy<T>(CreateInstanceOfT, LazyThreadSafetyMode.PublicationOnly);
    protected static T Instance => _Instance.Value;
    private static T CreateInstanceOfT()
    {
        return Activator.CreateInstance(typeof(T), true) as T;
    }
}

我是否错过任何明显的事情?

1 个答案:

答案 0 :(得分:0)

并不习惯这个版本的泛型,因为我的主要工作是统一的,并且他们每十年更新一次核心,但我很确定你需要公开的实例才能被允许阅读它。

当我写这篇文章时,我传统上创建了一个传递类型的私有静态实例,然后使用一个公共静态访问函数来创建该类型,如果它还不存在的话。

我可以在这里找到我自己的主引擎的完整示例: http://wiki.unity3d.com/index.php/Singleton