当实例化时存在对象依赖性时如何实现Singleton?

The*_*ght 2 c# singleton design-patterns

我有一个单例类,需要实例化一个对象.

我正在使用这种方法:

  public static AppConfig Instance(IConfigManager configManager)
    {
        if (_instanceHolder == null)
        {
            lock (LockObject)
            {
                if (_instanceHolder == null)
                {
                    _instanceHolder = new AppConfig(configManager);
                }
            }
        }

        return _instanceHolder;
    }
Run Code Online (Sandbox Code Playgroud)

这是在这种情况下实施单身人士的最佳方式吗?

谢谢

Jon*_*eet 6

在我看来,在这种情况下使用单身人士似乎是一个非常糟糕的主意.第二个调用将完全忽略configManager参数,因为它会发现已经有一个实例.这违反了最不出意的原则,IMO.

由于各种原因,单身模式通常是令人讨厌的,其中最重要的是可测试性.这个例子更糟糕 - 绝对远离它.

另外,在实现单例模式时,我不会使用双重检查锁定.有关我的首选选项,请参阅我关于单例模式的文章.

  • @ user133212:我会使用普通的依赖注入...但如果你真的*希望它是一个单例,那么放一个`Initialize(IConfigManager)`方法只能被调用一次(或者抛出一个异常)和一个单独的`Instance`属性,如果没有调用`Initialize`*,将抛出异常. (2认同)