如何在每个请求的会话中验证单例 class
How to make a validation of a singleton class in a session per request
我有一个配置 class 对于第一个用户访问基地将需要放置设置和服务几乎使用这个如果 firebird 或 oracle,设置保存在一个加密文件中,每次我开始我的应用程序检查这些设置,到目前为止一切正常。
private static Settings _data;
public static Settings Data
{
get
{
if (_data == null)
{
_data = new Settings();
if (_data.FilePath != null && !Directory.Exists(Path.GetDirectoryName(_data.FilePath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(_data.FilePath));
}
_data.Load(_data.FilePath);
}
return _data;
}
}
但是我对所有请求都使用一个会话,我决定改变有同步问题的那个,然后决定实现每个请求的会话,但是每次开始我的应用程序时都会创建一个会话并且需要创建在单例 class 中创建的会话服务数据。一种实现方法是在 Global.asax.
中创建我的会话之前进行验证
protected void Application_BeginRequest()
{
if (!Settings.Data.Valid())
throw new SingletonException();
var session = SessionManager.SessionFactory.OpenSession();
if (!session.Transaction.IsActive)
session.BeginTransaction(IsolationLevel.ReadCommitted);
CurrentSessionContext.Bind(session);
}
这是我的 SessionManager。
private SessionManager()
{
if (Settings.Data.SGDB == 1)
{
sessionFactory = Fluently.Configure()
.Database(new FirebirdConfiguration().ConnectionString(GetConnectionString())
.ShowSql())
.Mappings(GetMappings())
.ExposeConfiguration(c => c.SetProperty(Environment.CurrentSessionContextClass, "web"))
.BuildSessionFactory();
}
if (Settings.Data.SGDB == 0)
{
sessionFactory = Fluently.Configure()
.Database(OracleConfiguration
.Oracle10
.ConnectionString(GetConnectionString())
.ShowSql()
.Driver<OracleManagedDataClientDriver>()
.Dialect<Oracle10gDialect>()
)
.Mappings(GetMappings())
.ExposeConfiguration(c => c.SetProperty(Environment.CurrentSessionContextClass, "web"))
.BuildSessionFactory();
}
}
然而,对于每个请求,它都会愤怒地进行验证,这对我来说是一种更好的单例验证方法 class?
在应用程序启动过程中验证设置,如果无效则不要启动应用程序,否则它无法正常工作。
我有一个配置 class 对于第一个用户访问基地将需要放置设置和服务几乎使用这个如果 firebird 或 oracle,设置保存在一个加密文件中,每次我开始我的应用程序检查这些设置,到目前为止一切正常。
private static Settings _data;
public static Settings Data
{
get
{
if (_data == null)
{
_data = new Settings();
if (_data.FilePath != null && !Directory.Exists(Path.GetDirectoryName(_data.FilePath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(_data.FilePath));
}
_data.Load(_data.FilePath);
}
return _data;
}
}
但是我对所有请求都使用一个会话,我决定改变有同步问题的那个,然后决定实现每个请求的会话,但是每次开始我的应用程序时都会创建一个会话并且需要创建在单例 class 中创建的会话服务数据。一种实现方法是在 Global.asax.
中创建我的会话之前进行验证protected void Application_BeginRequest()
{
if (!Settings.Data.Valid())
throw new SingletonException();
var session = SessionManager.SessionFactory.OpenSession();
if (!session.Transaction.IsActive)
session.BeginTransaction(IsolationLevel.ReadCommitted);
CurrentSessionContext.Bind(session);
}
这是我的 SessionManager。
private SessionManager()
{
if (Settings.Data.SGDB == 1)
{
sessionFactory = Fluently.Configure()
.Database(new FirebirdConfiguration().ConnectionString(GetConnectionString())
.ShowSql())
.Mappings(GetMappings())
.ExposeConfiguration(c => c.SetProperty(Environment.CurrentSessionContextClass, "web"))
.BuildSessionFactory();
}
if (Settings.Data.SGDB == 0)
{
sessionFactory = Fluently.Configure()
.Database(OracleConfiguration
.Oracle10
.ConnectionString(GetConnectionString())
.ShowSql()
.Driver<OracleManagedDataClientDriver>()
.Dialect<Oracle10gDialect>()
)
.Mappings(GetMappings())
.ExposeConfiguration(c => c.SetProperty(Environment.CurrentSessionContextClass, "web"))
.BuildSessionFactory();
}
}
然而,对于每个请求,它都会愤怒地进行验证,这对我来说是一种更好的单例验证方法 class?
在应用程序启动过程中验证设置,如果无效则不要启动应用程序,否则它无法正常工作。