3

我需要能够调用此方法

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. 是上面的单例吗?如果不是,我应该如何更改它,以便每次我尝试获取连接时,它只使用一个实例并且不会尝试打开多个连接
4

2 回答 2

1

没错,是单例。

参考:使用 .NET 4 的 Lazy 类型

如果您使用的是 .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 属性检查是否已创建实例。

于 2015-07-09T22:28:45.650 回答
1

是的,这是一个单例,因为Lazy<T>确保您的工厂委托

return ConnectionMultiplexer.Connect(SettingsHelper.AzureRedisCache);

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

为清楚起见,我将设为CacheConnectionHelper静态:

public static class CacheConnectionHelper

顺便说一句,您的代码似乎是从这篇 MSDN 文章中复制而来的。

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

于 2015-07-09T22:53:29.073 回答