2015-07-09 21 views
3

我需要能够调用这个方法这是懒惰的<T>认为是单身?

IDatabase cache = CacheConnectionHelper.Connection.GetDatabase(); 

从我的应用程序的任何地方,我得到了这方面的辅助类从一些蔚蓝的页面

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时,它只使用一个实例并且不尝试打开多个连接

回答

1

是的,这是一个单身,因为Lazy<T>可以确保您的工厂代表

return ConnectionMultiplexer.Connect(SettingsHelper.AzureRedisCache); 

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

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

public static class CacheConnectionHelper 

顺便说一句,它看起来像你的代码是从this MSDN article复制。

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

+0

因此,如果我把这个放在Global.asax应用程序启动IDatabase缓存= CacheConnectionHelper.Connection.GetDatabase();,然后我把相同的行到处,那么它将使用应用程序启动时打开相同的连接!对? –

+0

@EstebanV:是的。 –

+0

你能指点我一个关于懒惰的好文档吗? –

1

正确,它是单身人士。

参考:using .NET 4's Lazy type

如果你使用.NET 4.0(或更高版本),你可以使用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尚未建立,如果你需要。