我有一个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的情况下(多个请求将共享单个实例)。请建议......
答案 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; }
}