3

シングルトンクラスでデータを保存したい。私が研究した限りでは、シングルトンクラスは一度だけインスタンス化できます。しかし、それは私にはうまくいきません。誰かが私のコードを修正できますか?

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
残念ながらHttpContext.Current.Session内部Application_Startにはアクセスできませんが、でアクセスできますApplication_AcquireRequestState
返された文字列を保持し、その値を内で使用する変数を使用できますApplication_AcquireRequestStateが、大きな問題はこれです。ページが読み込まれますか?2回なので、変数を使用するとnull、2回目のロードになりますが、 Application_Start1回だけ開始されます。
そのため、シングルトンクラスを使用して思いついたのですが、それでも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; }
        }
    }
}  

編集

このコードは、シングルトンを読んだ後、私のために機能します

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; }
    }
}
4

7 に答える 7

10

.NET4 を使用している場合、「完璧なシングルトン」は、 System.Lazyを使用して最もよく達成されることがよくあります。

C# のさまざまなシングルトン パターンとそのさまざまな長所と短所の説明については、この Web ページも参照してください。

于 2012-04-20T03:22:21.160 に答える
2
public static Singleton GetInstance()
    {
        lock (typeof(Singleton))
        {
            instance = new Singleton();
        }
        return instance;
    }

メンバーインスタンスがnullの場合にのみ、新しいインスタンスを作成する必要があります。あなたはいつもそれをしているようです。

于 2012-04-20T03:19:34.803 に答える
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;
}
于 2012-04-20T03:28:48.400 に答える
1
public sealed class Singleton
{
    public static readonly Singleton Instance =new Singleton();
    private Singleton(){}
}//end

これは私が今まで見た中で最高の SINGLETON です。

シンプルですが、ロックを使用せずにスレッドセーフです。

「インスタンス」を「 _インスタンス」フィールドを持つプロパティとして作成することもできます。

于 2012-04-20T03:49:01.633 に答える
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; 
      }
   }
}

マルチスレッド シングルトン

    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;
      }
   }
}

出典: C# でのシングルトンの実装

于 2014-10-10T04:44:02.503 に答える
0

実際には、CTOR がデフォルトのもの (パラメーターなし) の場合、変数定義に new を配置できます。

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

シングルトン設計パターンの調査を参照してください

于 2012-04-20T03:28:04.497 に答える