2012-04-20 8 views
3

シングルトンクラスでいくつかのデータを保存したい。私が研究した限り、シングルトンクラスは一度だけインスタンス化することができます。しかし、それは私のためには機能しません。誰かが私のコードを修正することができます:C#で完璧なシングルトンクラスを作成するには?

public class MvcApplication : System.Web.HttpApplication 
    { 
     Singleton clientsessionidinstance = Singleton.GetInstance(); 
     public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
     { 
      filters.Add(new HandleErrorAttribute()); 
     } 


     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.MapRoute(
       "Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
       new string[] { "MVCPrj.Controllers" } 
      ); 
     } 

     protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 

      RegisterGlobalFilters(GlobalFilters.Filters); 
      RegisterRoutes(RouteTable.Routes); 

      LOGICcLASSES.Logic.Auth ca = new LOGICcLASSES.Logic.Auth(); 
      clientsessionidinstance = Singleton.GetInstance(); 
      clientsessionidinstance.ClientSessionID = ca.Login(new LOGICcLASSES.Entities.ClientAuthentication() 
      { 
       IP = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"], 
       UserName = ConfigurationManager.AppSettings["ClientUserName"], 
       Password = ConfigurationManager.AppSettings["ClientPassword"] 
      }); 
     } 

     protected void Application_AcquireRequestState(object sender, EventArgs e) 
     { 
      if (System.Web.HttpContext.Current.Session != null) 
      { 
       if (!string.IsNullOrEmpty(clientsessionidinstance.ClientSessionID)) 
       { 
        CurrentUserSession.Store<string>("ClientSessionID", clientsessionidinstance.ClientSessionID); 
       } 
      } 
     } 
    } 

ので、目標はApplication_Start @私は、アカウントにログインして、これです。その後、戻り文字列をHttpContext.Current.Sessionに保存する必要があります。
Application_Startの中のHttpContext.Current.Sessionにアクセスすることはできませんが、Application_AcquireRequestStateで可能です。
返された文字列を保持し、その値をApplication_AcquireRequestStateの内部で使用する変数を使用できますが、大きな問題はページが読み込まれることですか? 2回目ですので、変数を使用すると、2回目のロードでnullになりますが、Application_Startはまだ1回だけ開始されます。
私はSingletonクラスを使いましたが、まだ2番目の負荷でnull値を取得しています。

シングルトンクラス:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace MVCPrj.Areas.WebPage.Logic 
{ 
    public class Singleton 
    { 
     private static Singleton instance; 

     private Singleton() { } 

     public static Singleton GetInstance() 
     { 
      lock (typeof(Singleton)) 
      { 
       instance = new Singleton(); 
      } 
      return instance; 
     } 

     private string _ClientSessionID; 
     public string ClientSessionID 
     { 
      get { return _ClientSessionID; } 
      set { _ClientSessionID = value; } 
     } 
    } 
} 

EDITこのコードは、私の作品

Singleton

public class Singleton 
{ 
    private static readonly object _mutex = new object(); 
    private static volatile Singleton _instance = null; 
    private Singleton() { } 

    public static Singleton Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       lock (_mutex) 
       { 
        if (_instance == null) 
        { 
         _instance = new Singleton(); 
        } 
       } 
      } 
      return _instance; 
     } 
    } 

    private string _ClientSessionID; 
    public string ClientSessionID 
    { 
     get { return _ClientSessionID; } 
     set { _ClientSessionID = value; } 
    } 
} 
+2

は車輪の再発明をしないでください:http://csharpindepth.com/Articles/General/Singleton.aspx – BrokenGlass

+2

パーフェクトシングルトンが矛盾した表現です。ファクトリを作成します。自分の生涯を理解しようとする授業を作ってはいけません。 –

答えて

10

.NET4を使用している場合、「完璧なシングルトン」は多くの場合、System.Lazyを使用すると最も効果的です。

C#での多くの異なるシングルトンパターンとそのさまざまな賛否両論については、this web pageも参照してください。そのCTORは、デフォルトの(パラメータなし)であれば

+0

+1 'LazySingleton1'は私のために働きます。ありがとう! – fiberOptics

2
public static Singleton GetInstance() 
    { 
     lock (typeof(Singleton)) 
     { 
      instance = new Singleton(); 
     } 
     return instance; 
    } 

を読んだ後、あなたは唯一のメンバーであれば、新しいインスタンスを作成する必要がありますインスタンスはnullです。あなたはいつもそれをやっているようです。

+0

'lock(typeof(Singleton)){var mine = Singleton.GetInstance(); } ' –

+0

+1ヌル値のチェックを思い出させるために感謝します。 – fiberOptics

+6

[タイプオブジェクトをロックしないでください!](http://bytes.com/topic/c-sharp/answers/249277-dont-lock-type-objects) –

0

実は、あなたは変数の定義で新しいを置くことができます。

public sealed class Singleton { 
    public readonly Singleton Instance = new Singleton(); 
    ... 
} 

は、私は私のために、この一般的な基本クラスを常に使用していたExploring the Singleton Design Pattern

1

を参照してください。シングルトン:

public class SingletonBase<T> where T : class 
{ 
    static SingletonBase() 
    { 
    } 

    public static readonly T Instance = 
     typeof(T).InvokeMember(typeof(T).Name, 
           BindingFlags.CreateInstance | 
           BindingFlags.Instance | 
           BindingFlags.Public | 
           BindingFlags.NonPublic, 
           null, null, null) as T; 
} 
+1

これにより、コードによってインスタンスが作成されないのはなぜですか? – TheSean

+0

@TheSean publicコンストラクタはありません。 –

+0

基本クラスである必要はありません。 Singleton .Instanceを返すMyClassにパブリック静的プロパティを追加すると、初期化が怠惰になるはずです。 – erikH

1
public sealed class Singleton 
{ 
    public static readonly Singleton Instance =new Singleton(); 
    private Singleton(){} 
}//end 

これは私がした最高のシングルトン今まで見た。

ロックを使用せずに単純ですがスレッドセーフです。

あなたはまた、「_INSTANCE」フィールドを持つプロパティとして「インスタンス」を作ることができます。

1

私は、このようなシングルトンを使用して、私は問題を抱えていない:

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

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

    private Settings() 
    { 
     _fileName = "Settings.ini"; 
    } 
.... 
} 
1

シングルトン

using System; 

public class Singleton 
{ 
    private static Singleton instance; 

    private Singleton() {} 

    public static Singleton Instance 
    { 
     get 
     { 
     if (instance == null) 
     { 
      instance = new Singleton(); 
     } 
     return instance; 
     } 
    } 
} 

静的初期

public sealed class Singleton 
{ 
    private static readonly Singleton instance = new Singleton(); 

    private Singleton(){} 

    public static Singleton Instance 
    { 
     get 
     { 
     return instance; 
     } 
    } 
} 

MultithreaをDEDシングルトン

using System; 

public sealed class Singleton 
{ 
    private static volatile Singleton instance; 
    private static object syncRoot = new Object(); 

    private Singleton() {} 

    public static Singleton Instance 
    { 
     get 
     { 
     if (instance == null) 
     { 
      lock (syncRoot) 
      { 
       if (instance == null) 
        instance = new Singleton(); 
      } 
     } 

     return instance; 
     } 
    } 
} 

出典:Implementing Singleton in C#

関連する問題