asp.net中的单例模式

时间:2013-11-27 09:20:41

标签: c# asp.net singleton

我有一个asp.net应用程序。我使用单例模式来设计我的代码。看起来如下......

public static class FactoryClass
    {
        private static Core obj = null;
        private static readonly object padLock = new object();
        public static Core GetInstance()
        {
            lock (padLock)
            {
                if (obj == null)
                {
                    obj = new Core();
                }
            }
            return obj;
        }
    }

此实现是线程安全的。我想知道这个实现是否正确,在asp.net的情况下(多个请求将共享单个实例)。请建议......

2 个答案:

答案 0 :(得分:0)

你的单一对象范围将在app域内,这意味着所有会话将在该appdomain中使用SingleTon对象(默认)。

只有当您拥有具有不同服务器的服务器场时,才会创建新对象。

我只在你需要构造一个对象时才更喜欢锁,而不是在你要返回它时。以下是修改后的代码:

public static class FactoryClass
{
    private static Core obj = null;
    private static readonly object padLock = new object();

    public static Core GetInstance()
    {
        lock (padLock)
        {
          if (obj == null)
          {
                obj = new Core();
          }
        }
        return obj;
      }
}

答案 1 :(得分:0)

这取决于Core类型对象中存储的数据类型。说一些配置数据,你想要单独管理(即它与web.config中的那些完全不同),那么它是有意义的。

但是,假设网站是购物车应用程序...并且您希望存储类似的用户对象...说用户对象包含他已保存在卡中的项目列表。这将存储在appdomain中。因此,它违背了您的实施。因为您希望将您的用户信息与传入请求相关联,而不是整个应用程序。因此,根据您的要求,您至少需要对此进行一次查询...(当然,以传统意义说话)。

继续使用相同的示例,假设您希望以这种方式使用用户对象:此用户对象正在Web应用程序内的不同类中使用。传统上,人们会编写代码来访问数据库,并在每次需要使用用户对象时创建对象。相反,你需要一些类似单身的模式。在这种情况下,您的用户对象将从db中查询(和创建)一次,并在请求的整个生命周期中重复使用。如果您将此对象(在其创建后发布)缓存在http上下文缓存中,则可以进行此操作...即。 HttpContext.Current.Items["foo"]

以下代码解释了......

public class AppUser
{
    public string Username { get; set; }
    public string[] Roles { get; set; }

    public AppUser()
    {
        var appuser = HttpContext.Session["AppUser"] as AppUser;
        if(appuser == null)
            throw new Exception("User session has expired");
        Username = appuser.Username;
        Roles = appuser.Roles;
    }
}


public class WebAppContext
{
    const string ContextKey = "WebAppContext";

    WebAppContext() { } //empty constructor
    public static WebAppContext Current 
    {
        get
        {
            var ctx = HttpContext.Current.Items[ContextKey] as WebAppContext;
            if(ctx == null)
            {
                try
                {
                    ctx = new WebAppContext() { User = new AppUser() };
                }
                catch
                {
                    //Redirect for login
                }
                HttpContext.Current.Items.Add(ContextKey, ctx);                     
            }       
            return ctx;     
        }
    }

    public AppUser User { get; set; }
}

Ps:取自这篇文章:a request level singleton object in asp.net