针对每个用户的单例模式ASP.NET C#
我正在用asp.net c#构建一个web应用程序,我有一个类,我想在多个页面中使用它,而不是每次都实例化它。我需要加载其中的数据,并且在用户会话期间永远不会丢失它们。我考虑过单例模式,但它在浏览器之间共享了类的实例。我怎样才能解决这个问题?单例不是答案。看看,然后 下一页针对每个用户的单例模式ASP.NET C#,c#,asp.net,singleton,design-patterns,C#,Asp.net,Singleton,Design Patterns,我正在用asp.net c#构建一个web应用程序,我有一个类,我想在多个页面中使用它,而不是每次都实例化它。我需要加载其中的数据,并且在用户会话期间永远不会丢失它们。我考虑过单例模式,但它在浏览器之间共享了类的实例。我怎样才能解决这个问题?单例不是答案。看看,然后 下一页 UserData data = (UserData) Session["UserData"]; 如果您有inproc会话状态,您可以使用类似的东西 class Singleton { static object l
UserData data = (UserData) Session["UserData"];
如果您有inproc会话状态,您可以使用类似的东西
class Singleton
{
static object locker = new Object();
public static Singleton Instance
{
get
{
var inst = HttpContext.Current.Session["InstanceKey"] as Singleton;
if (inst == null)
{
lock (locker)
{
inst = HttpContext.Current.Session["InstanceKey"] as Singleton;
if (inst == null)
{
inst = new Singleton();
HttpContext.Current.Session["InstanceKey"] = inst;
}
}
}
return inst;
}
}
}
可以改进代码,以避免对所有用户进行锁定。我不知道这样实现Singleton是否是一个好主意,我建议您看看是否可以用其他方式设计代码。如果Singleton需要强调可重入调用只生成类/对象的一次使用,那么Singleton可能是答案。除非OP使用线程或其他为单个用户运行并发代码的方法,否则严格来说,这是不需要的。对于打开页面的每个用户,必须只有一个类实例。我的问题是,使用单例模式和静态实例,我在用户之间共享数据,等等browsers@Stefano如果你使用一个会话,你可以实现你想要的。在整个页面和会话生命周期内,只有一个数据实例。但是,如果同一用户从不同的计算机或不同的浏览器登录,这将失败。根据定义,这不是单例模式。
class Singleton
{
static object locker = new Object();
public static Singleton Instance
{
get
{
var inst = HttpContext.Current.Session["InstanceKey"] as Singleton;
if (inst == null)
{
lock (locker)
{
inst = HttpContext.Current.Session["InstanceKey"] as Singleton;
if (inst == null)
{
inst = new Singleton();
HttpContext.Current.Session["InstanceKey"] = inst;
}
}
}
return inst;
}
}
}