C# 这是Singleton+;延迟加载?
我试图弄清楚这段代码中使用了什么模式。 我的理解是,这是一个C# 这是Singleton+;延迟加载?,c#,session,design-patterns,singleton,lazy-loading,C#,Session,Design Patterns,Singleton,Lazy Loading,我试图弄清楚这段代码中使用了什么模式。 我的理解是,这是一个 单例模式(实际上有一个私有构造函数)和 延迟加载(或延迟初始化?) 我也被这个问题弄糊涂了 UserSession属性,它是类的同一类型,其用法在我看来很奇怪 有人能解释一下这里发生了什么吗?这里我看到了单例模式: 类的静态方法在类实例不存在时生成类实例 至于懒散加载,我不确定我们是否可以看到这样的情况,因为懒散加载的想法是为了节省资源,但在这里我们可以看到一个轻量级对象 使用类的静态方法获取同一个类的实例是一种常见做法,但不是最佳方
有人能解释一下这里发生了什么吗?这里我看到了单例模式: 类的静态方法在类实例不存在时生成类实例 至于懒散加载,我不确定我们是否可以看到这样的情况,因为懒散加载的想法是为了节省资源,但在这里我们可以看到一个轻量级对象
使用类的静态方法获取同一个类的实例是一种常见做法,但不是最佳方法。更好的选择是使用上下文获取类的实例,避免使用静态方法,因为它可以从应用程序的任何地方调用,但这里我们面临的是HttpContext。在我看来,当前的静态属性本身就是一个设计问题,因此我们可以像那样使用UserContext。“有人能解释一下这里发生了什么吗?”
static UserSession
(只读)属性返回HttpContext.Current.Session[“\u UserSession”]
,如果null
,则首先实例化它。显然,它存储的对象类型为UserSession
。是。如果用户会话在会话中不存在,它将被创建并卡在其中。但是,请考虑如果两个线程同时开始执行此代码会发生什么,特别是null检查-它们将分别创建一个新的UserSession对象并返回两个不同的对象。这样的典型单例包括一个锁和两个空检查。您可以通过使用Lazy
来解决这个问题,它为您处理所有的管道。我认为它不可能是正确的单例,因为它不是线程安全的。双锁模式可能安全,也可能不安全。这取决于你的CPU架构和它如何刷新缓存线,远远超出了我的工资等级。就用懒惰。如果使用锁,只需放弃锁外的null检查,或者非常熟悉目标的每个体系结构。
public class UserSession
{
private UserSession()
{
}
public static UserSession Current
{
get
{
var session= (UserSession)HttpContext.Current.Session["_userSession"];
if (session == null)
{
session = new UserSession();
HttpContext.Current.Session["_userSession"] = session;
}
return session;
}
}
public User User { get; set; }
}
//USAGE
UserSession.Current.User