首页 > 解决方案 > 这是单例 + 延迟加载吗?

问题描述

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

我试图弄清楚这段代码中使用了哪些模式。我的理解是,这是一个

  1. 单例模式(实际上有一个私有构造函数)和一个
  2. 延迟加载(或延迟初始化?)因为 GET 的实现方式。

我也很困惑

  1. 与类相同类型的 UserSession 属性和用法本身对我来说似乎很奇怪。

有人可以解释这里发生了什么吗?

标签: c#sessiondesign-patternssingletonlazy-loading

解决方案


在这里我看到单例模式:类的静态方法如果不存在则生成类实例

至于 LazyLoading,我不确定我们能不能看到这样,因为延迟加载的想法是为了节省资源,但在这里我们可以看到一个轻量级的对象

使用类的静态方法来获取同一个类的实例是一种常见的做法,但不是最好的方法。更好的选择是使用上下文来获取类的实例并避免使用静态方法,因为它可以从应用程序的任何位置调用,但在这里我们面临 HttpContext.Current 静态属性,在我看来这本身就是一个设计问题,所以我们可以使用像这样的用户上下文


推荐阅读