这个Lazy <t>被认为是单身吗?

时间:2015-07-09 22:16:05

标签: c# azure singleton stackexchange.redis azure-redis-cache

我需要能够调用此方法

IDatabase cache = CacheConnectionHelper.Connection.GetDatabase();

从我的应用程序的任何地方,我从一些azure页面获得了这个连接助手类

public class CacheConnectionHelper
    {
        private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
        {
            return ConnectionMultiplexer.Connect(SettingsHelper.AzureRedisCache);
        });

        public static ConnectionMultiplexer Connection
        {
            get
            {
                return lazyConnection.Value;
            }
        }
    }

问题是:

  1. 是上面的单例,如果不是我应该如何更改它,以便每次我尝试获取一个Connection时,它只使用一个实例并且不会尝试打开多个连接

2 个答案:

答案 0 :(得分:1)

正确,它是单身。

参考:using .NET 4's Lazy type

  

如果您使用的是.NET 4(或更高版本),则可以使用System.Lazy   键入使懒惰真的很简单。你需要做的就是通过一个   委托给调用Singleton构造函数的构造函数 -   使用lambda表达式最容易完成。

public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazy.Value; } }

    private Singleton()
    {
    }
}

如果您需要,还可以使用IsValueCreated property检查实例是否已创建。

答案 1 :(得分:1)

是的,这是一个单身人士因为Lazy<T>确保你的工厂委托

return ConnectionMultiplexer.Connect(SettingsHelper.AzureRedisCache);

...仅调用一次。它将在第一次读取lazyConnection.Value时调用。剩余的调用将返回从第一次调用返回的相同值/实例(它被缓存)。

为清楚起见,我会CacheConnectionHelper静态:

public static class CacheConnectionHelper

顺便说一下,您的代码似乎是从this MSDN article复制的。

  

这提供了一种线程安全的方法来初始化单个连接的ConnectionMultiplexer实例。