您好我有兴趣实现一个返回单个对象的方法。我已经根据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;
}
}
答案 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。
如果您保持代码仅强制执行一个实例,则必须进行其他改进: