2015-07-09 18 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尚未建立,如果你需要。