静的なNhibernateISessionFactoryを保持するNHibernateSessionFactoryクラスを作成しました。これは、セッションファクトリが1つしかないことを確認するために使用され、OpenSession()が最初に呼び出されたときに、実際のSessionFactoryを作成します。次に同じものを使用してセッションを開きます。コードは次のようになります。
public class NhibernateSessionFactory : INhibernateSessionFactory
{
private static ISessionFactory _sessionFactory;
public ISession OpenSession()
{
if (_sessionFactory == null)
{
var cfg = Fluently.Configure().
Database(SQLiteConfiguration.Standard.ShowSql().UsingFile("Foo.db")).
Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>());
_sessionFactory = cfg.BuildSessionFactory();
BuildSchema(cfg);
}
return _sessionFactory.OpenSession();
}
private static void BuildSchema(FluentConfiguration configuration)
{
var sessionSource = new SessionSource(configuration);
var session = sessionSource.CreateSession();
sessionSource.BuildSchema(session);
}
}
今、私は問題を抱えています。私のアプリケーションはクライアントとサーバーに分割されています。Nhibernateのものはサーバー側にあります。起動時に、クライアントとサーバーの両方が、NhibernateSessionFactoryを使用するいくつかのサービスを介してデータベースにアクセスしたいと考えています。結果は、要求がクライアントから来る前に_sessionFactoryが作成されるかどうかの競合状態です。そうでない場合は失敗します。
NhibernateSessionFactoryに何らかのキューイングまたは待機メカニズムが必要だと思いますが、どうすればよいかわかりません。誰かが以前に同じ問題を抱えていましたか?最善の解決策は何ですか?