Wie erstellen Sie eine perfekte Singleton-Klasse in c#?
Ich wollen speichern Sie einige Daten mit Singleton-Klasse. Soweit ich das untersucht habe, singleton-Klasse kann instanziert werden, nur für einmal. Aber es funktioniert nicht für mich. Kann jemand korrekt mein code:
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);
}
}
}
}
Ziel ist es also, das, @ Application_Start
ich mich anmelden in einem Konto. Dann sollte ich speichern Sie die return string auf HttpContext.Current.Session
.
Leider kann ich nicht auf die HttpContext.Current.Session
innen Application_Start
aber es ist möglich, auf Application_AcquireRequestState
.
Kann ich eine variable verwenden, halten Sie die zurückgegebene Zeichenfolge und verwenden Sie dann Ihren Wert innerhalb der Application_AcquireRequestState
, aber das große problem ist das die Seite geladen wird? zweimal, also, wenn ich eine variable verwenden, wird es null
im zweiten laden, aber Application_Start
noch einmal initiiert.
So kam ich mit einer Singleton-Klasse, aber trotzdem bekomme ich null Werte, die auf der zweiten Last.
Singleton-Klasse:
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; }
}
}
}
BEARBEITEN
Dieser code funktioniert für mich nach dem Lesen 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; }
}
}
Perfekte singleton ist ein oxymoron. Erstellen Sie eine Fabrik. Machen Sie nicht eine Klasse, die versucht zu verstehen, seiner eigenen Lebenszeit.
InformationsquelleAutor fiberOptics | 2012-04-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit .NET4 das "perfekte singleton" ist oft am besten erreicht mit System.Faul.
Siehe auch diese web-Seite für eine Beschreibung von vielen verschiedenen singleton Muster in C# und Ihre verschiedenen vor-und Nachteile.
LazySingleton1
für mich funktioniert. Danke!InformationsquelleAutor Ian Mercer
Müssen Sie nur eine neue Instanz erstellen, wenn das Mitglied die Instanz null ist. Sie scheinen, es zu tun die ganze Zeit.
lock(typeof(Singleton)){ var mine = Singleton.GetInstance(); }
+1 danke für die Erinnerung der überprüfung von null-Wert.
Sperren nicht Geben-Objekten!
InformationsquelleAutor John3136
Habe ich immer das generische Basisklasse für meine singletons:
Keinen öffentlichen Konstruktor.
Muss nicht sein, eine base-Klasse. Nur fügen Sie eine öffentliche statische Eigenschaft, MyClass Rückkehr Singleton<MyClass>.Instanz, und das sollte Initialisierung faul!?
Ja, das würde auch funktionieren, aber ein Teil von MyClass : SingletonBase(MyClass) ist, dass es dokumentiert die Erwartungen.
InformationsquelleAutor Cade Roux
Ich benutze solche singleton-und ich habe keine Probleme:
InformationsquelleAutor novicegis
dies ist die beste SINGLETON, die ich je gesehen habe.
es ist eine einfache aber " thread-safe ohne mithilfe von sperren.
können Sie auch die 'Instanz' als eine Eigenschaft mit einem " _instance' Feld.
InformationsquelleAutor Scott 混合理论
Singleton
Statische Initialisierung
Multithread-Singleton
Quelle: Implementing Singleton in C#
InformationsquelleAutor Razan Paul
Tatsächlich, Sie können die neue in der Variablen-definition, wenn seine CTOR ist standardmäßig (ohne Parameter):
Sehen Erkunden Sie das Singleton-Entwurfsmuster
InformationsquelleAutor David.Chu.ca