单身实施检查

时间:2013-08-28 09:52:00

标签: c# singleton

您好我有兴趣实现一个返回单个对象的方法。我已经根据MSDN上的示例创建了一个实现,但我不确定我的实现是否是corect。

代码运行得很好,但我不知道如何检查它是否是同一个对象实例。

这是我的代码:

 public class FileShareAccessFactory : IFileShareAccessFactory
{
    private volatile static IFileShareAccess m_fileShareAccess;
    private static object m_SyncRoot = new object();

    public IFileShareAccess GetFileShareAccessInstance(IContextFactory contextFactory, ILogger logger)
    {
        if (m_fileShareAccess == null)
        {
            lock (m_SyncRoot)
            {
                if (m_fileShareAccess == null)
                {
                    m_fileShareAccess = new FileShareAccess(contextFactory, logger);
                }
            }
        }
        return m_fileShareAccess;
    }
}

3 个答案:

答案 0 :(得分:6)

作为双重检查的实现,是的 - 这将正常工作。它甚至不需要volatile,因为同步的双重检查将处理任何少量的“它是错误的null读取”。就个人而言,我更关心的事实是似乎不尊重API - 即如果我问一个实例是否指定了特定的上下文工厂和记录器,它实际上给了我一些使用无关上下文工厂和记录器的东西。坦率地说,还有IoC / DI容器,您可以将其卸载到。

答案 1 :(得分:0)

使用object.ReferenceEquals()检查两个对象是否是同一个实例。

例如:

    [TestMethod]
    public void TestGetFileShareAccessInstance()
    {
        var first = FileShareAccessFactory.GetFileShareAccessInstance(contextFactory, logger);
        var second = FileShareAccessFactory.GetFileShareAccessInstance(contextFactory, logger);

        Assert.IsTrue(object.ReferenceEquals(first, second));
    }

答案 2 :(得分:0)

我现在注意到你的构造函数中有依赖项,如果它真的是单例,那么它们也必须是单例。如果没有,那么你想再想一想这是一个单身人士。

您可能希望查看Unity等依赖注入。这样,您可以使用ContainerControlledLifetimeManager注册此类,以在上下文工厂,记录器和此对象上强制执行单例。它允许以后灵活性,因为您可能需要更多的上下文工厂,因此需要更多FileShareAccessFactory s。

如果您保持代码仅强制执行一个实例,则必须进行其他改进:

  1. 将构造函数设为私有。
  2. 密封课程 - 或者可以构建一个下属的课程。