2010-04-23 10 views
6

La pregunta sigue desde Fluent NHibernate + multiple databases (no es necesario seguir este enlace, aquí debería haber suficientes antecedentes).Cómo identificar la Fábrica de Sesiones de una entidad particular con NHibernate Fluido y Múltiples Bases de Datos

Mi problema es el siguiente:

estoy usando Fluido NHibernate. Mi aplicación usa múltiples bases de datos. Cada base de datos tiene sus propias entidades registradas (mapeadas) en su contra. El resultado es que tienen varias Fábricas de Sesión, cada una relacionada con una única base de datos, y cada una "contiene" su propio conjunto de entidades mapeadas.

Para cargar entidades He creado una clase de fábrica genérica que proporciona algunos métodos de carga estándar utilizables para cualquier entidad registrada (en cualquier base de datos). El problema es: los métodos de carga necesitan usar la fábrica de sesiones correcta para la clase de entidad con la que estoy ocupado. ¿Cómo puedo determinar qué fábrica de sesión necesito usar? Tengo todas las Fábricas de Sesión 'a la mano' (e indexadas por el nombre de la base de datos), solo necesito un medio, conociendo solo el tipo de Entidad que estoy a punto de cargar, de elegir la Fábrica de Sesión adecuada para usar.

Por ejemplo:

public IBaseBusinessObject CreatePopulatedInstance(Type boType, Guid instanceKey) 
{ 
    IBaseBusinessObject result = null; 
    ISessionFactory sessionFactory = GetSessionFactory(boType); 
    using (ISession session = sessionFactory.OpenSession()) 
    { 
    using (session.BeginTransaction()) 
    { 
     result = (IBaseBusinessObject)session.Get(boType, instanceKey); 
    } 
    } 
    return result; 
} 

Lo que tiene que ir en en GetSessionFactory (BOType)?

¡Gracias por leer!

Respuesta

3

Comenzaría mirando el método ISessionFactory.GetClassMetaData.

IClassMetadata metadata = sessionfactory.GetClassMetadata(boType); 

Si puede mantener una lista de las instancias ISessionFactory, puede enumerar su camino a través de ellos hasta que encuentre el que tiene metadatos para su tipo BOType.

Nunca lo he usado y no tengo mis referencias a mano, pero esperaría que devuelva nulo o que genere una excepción si no reconoce el tipo. Si obtiene un valor para los metadatos sin un error, entonces esa es su fábrica de sesiones.

Buena suerte

Neil.

+0

Gracias. Esta solución funcionó. – Trevor

+0

El método GetClassMetadata() devuelve nulo si el tipo especificado no está gestionado por la fábrica de sesiones en cuestión. – Trevor

+0

De nada. –

Cuestiones relacionadas