2010-04-23 3 views
6

Question suivante de Fluent NHibernate + multiple databases (pas besoin de suivre ce lien, il devrait y avoir assez de fond ici).Comment identifier une session Usine particulière avec Fluent NHibernate et plusieurs bases de données

Mon problème est le suivant:

J'utilise Fluent NHibernate. Mon application utilise plusieurs bases de données. Chaque base de données a ses propres entités enregistrées (mappées) contre elle. Le résultat est que plusieurs Usines de Session, chacune se rapportant à une seule DB, et chacune «contenant» son propre ensemble d'entités mappées.

Pour le chargement d'entités, j'ai créé une classe Factory générique qui fournit des méthodes de chargement standard utilisables pour toute entité enregistrée (dans n'importe quelle base de données). Le problème est le suivant: Les méthodes de chargement doivent utiliser la fabrique de sessions correcte pour la classe d'entité avec laquelle je suis occupé. Comment déterminer quelle usine de session dois-je utiliser? J'ai toutes les usines de session en main (et indexées par nom de base de données), j'ai juste besoin d'un moyen, sachant juste le type d'entité que je vais charger, de choisir la bonne session à utiliser.

Par exemple:

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; 
} 

Que faut-il aller dans GetSessionFactory (BOType)?

Merci d'avoir lu!

Répondre

3

Je commencerais par regarder la méthode ISessionFactory.GetClassMetaData.

IClassMetadata metadata = sessionfactory.GetClassMetadata(boType); 

Si vous pouvez maintenir une liste de vos instances ISessionFactory, vous pouvez énumérer votre chemin à travers eux jusqu'à ce que vous trouviez celui qui a des métadonnées pour votre BOType type.

Je ne l'ai jamais utilisé et je n'ai pas mes références en main, mais je m'attendrais à ce qu'il retourne une valeur nulle ou déclenche une exception s'il ne reconnaît pas le type. Si vous obtenez une valeur pour les métadonnées sans erreur, c'est votre atelier de session.

Bonne chance

Neil.

+0

Un grand merci. Cette solution a fonctionné. – Trevor

+0

La méthode GetClassMetadata() renvoie null si le type spécifié n'est pas géré par Session Factory en question. – Trevor

+0

De rien. –

Questions connexes