Comment créer un parfait Singleton classe en c#?
Je veux stocker des données avec classe Singleton. Autant que je l'ai étudié, classe singleton peut être instancié seulement pour une fois. Mais il ne fonctionne pas pour moi. Quelqu'un peut-il corriger mon 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);
}
}
}
}
Donc, le but est de ce, @ Application_Start
j'ai pour vous connecter à un compte. Ensuite, je dois enregistrer la chaîne de retour sur HttpContext.Current.Session
.
Malheureusement, je ne peux pas accéder à la HttpContext.Current.Session
à l'intérieur de Application_Start
mais il est possible sur Application_AcquireRequestState
.
Je peux utiliser une variable qui va contenir la chaîne retournée et ensuite utiliser sa valeur à l'intérieur de la Application_AcquireRequestState
, mais le gros problème est présent, le chargement de la page? deux fois, donc si je vais utiliser une variable, il deviendra null
à la deuxième charge, mais Application_Start
est toujours déclenchée une fois.
Donc, je suis venu à l'aide d'une classe Singleton, mais encore obtenir les valeurs nulles à la deuxième charge.
Classe Singleton:
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; }
}
}
}
MODIFIER
Ce code fonctionne pour moi après la lecture de 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; }
}
}
Parfait singleton est un oxymore. Créer une usine. Ne pas faire une classe qui tente de comprendre sa propre vie.
OriginalL'auteur fiberOptics | 2012-04-20
Vous devez vous connecter pour publier un commentaire.
Si vous êtes en utilisant .NET4 le parfait "singleton" est souvent le mieux réalisé à l'aide de Système.Paresseux.
Voir aussi cette page web pour une description des différents singleton modèles en C# et de leurs divers avantages et inconvénients.
LazySingleton1
fonctionne pour moi. Merci!OriginalL'auteur Ian Mercer
Vous avez seulement besoin de créer une nouvelle instance, si le membre de l'instance est null. Vous semblez être le faire tout le temps.
lock(typeof(Singleton)){ var mine = Singleton.GetInstance(); }
+1 merci de rappeler à la vérification de la valeur null.
Ne pas Verrouiller les Objets de Type!
OriginalL'auteur John3136
J'ai toujours utilisé ce générique de la classe de base pour mon singletons:
Pas de constructeur public.
N'a pas à être une classe de base. Juste d'ajouter une propriété statique de la MyClass retour Singleton<Maclasse>.Exemple, et qui devrait en faire l'initialisation paresseuse!?
Oui, ce serait aussi le travail, mais une partie de MyClass : SingletonBase(Maclasse), c'est qu'il documents les attentes.
OriginalL'auteur Cade Roux
- Je utiliser ces singleton et je n'ai pas de problèmes:
OriginalL'auteur novicegis
c'est le meilleur SINGLETON j'ai jamais vu.
il est simple mais thread-safe, sans l'aide de verrous.
vous pouvez également faire de la "Instance "comme une propriété avec un" _instance champ.
OriginalL'auteur Scott 混合理论
Singleton
Initialisation Statique
Multithread Singleton
Source: La mise en œuvre de Singleton en C#
OriginalL'auteur Razan Paul
En fait, vous pouvez mettre la nouvelle dans la définition de la variable si son CTOR est la valeur par défaut (pas de paramètres):
Voir Explorer le Modèle de Conception Singleton
OriginalL'auteur David.Chu.ca