He escrito una clase NHibernateSessionFactory que contiene un Nhibernate ISessionFactory estático. Esto se usa para asegurarnos de que solo tenemos una fábrica de sesiones, y la primera vez que se llama OpenSession() creo la SessionFactory actual - las próximas veces que use el mismo y abra una sesión en él. El código se ve así:Asegúrese de que NHibernate SessionFactory solo se haya creado una vez
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);
}
}
Ahora tengo un problema. Mi aplicación se divide entre cliente y servidor. El material de Nhibernate está en el lado del servidor. Al inicio, tanto mi cliente como mi servidor desean acceder a la base de datos a través de algunos servicios que utilizarán NhibernateSessionFactory. El resultado es una condición de carrera para si se crea _sessionFactory antes de que la solicitud provenga del cliente. Si no es así, fallará ...
Supongo que necesito algún tipo de mecanismo de cola o espera en la NhibernateSessionFactory, pero no estoy seguro de qué hacer. ¿Alguien tuvo el mismo problema antes? ¿Cuál es la mejor solución?
Gracias! Suena razonable. Acabo de agregar una solución usando Mutex. Pero debería usar bloqueo en su lugar? – stiank81
Pero, ¿y si necesito varias conexiones de bases de datos simultáneamente? Actualmente no sé ni otra solución alternativa para crear varias Fábricas de Sesión ... – JustAMartin
¿Cómo implementar esto en los controladores? – Chazt3n