我编写了一个继承自SessionStateStoreProviderBase的自定义SessionStoreProvider类。我有一个名为SessionStore的类,它为我用作存储会话数据的后端的数据库提供数据访问层。我已经创建了一个单例实例属性,如下面的
public static SessionStore Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new SessionStore();
}
}
return instance;
}
}
回到我的SessionStoreProvider方法中,我正在实例化这样的类
var sessionStore = SessionStore.Instance;
我的目标是确保一次只存在一个用户会话的会话存储。这是一个合理的方法吗?这会产生任何负面影响吗?有一个更好的方法吗?
答案 0 :(得分:1)
尽管双重检查锁定适用于大多数情况,但使静态单例有效工作可能需要一些额外的工作:
public class SessionStore {
/// <summary>
/// Gets the current instance of <see cref="SessionStore" />.
/// </summary>
public static SessionStore Instance {
get {
return SessionStoreInternal.Instance;
}
}
/// <summary>
/// Supports lazy initialisation of a <see cref="SessionStore" /> instance.
/// </summary>
internal class SessionStoreInternal {
/// <summary>
/// The current instance of <see cref="SessionStore" />.
/// </summary>
internal static readonly SessionStore Instance = new SessionStore();
/// <summary>
/// Required to stop the Instance field being initialised through BeforeFieldInit behaviour,
/// allowing us to only initialise the field when it is accessed.
/// </summary>
static SessionStoreInternal() { }
}
}
这背后的原因是,它允许我们管理静态单例而无需创建任何锁。创建这样的嵌套类型将允许我们访问托管单例,知道静态构造函数在需要时最多可被调用一次,归因于惰性设计概念。