1 votes

NHibernate : Utilisation de fichiers de mapping hbm légèrement différents selon le contexte

Une de mes applications est un site web public, l'autre est un intranet. Le site web public fonctionne avec un utilisateur à sécurité limitée qui doit accéder à une certaine table par le biais d'une vue, alors que l'intranet peut accéder à la table elle-même.

Cela semble assez simple à mettre en place en utilisant Fluent NHibernate. Dans ma ClassMap, je pourrais faire une vérification comme ceci :

public class MyEntityClassMap : ClassMap<MyEntity>
{
     public MyEntityClassMap()
     {
         if (NHibernateConfig.Current.Context == "intranet")
            Table("t_MyEntity");
         else
            Table("v_MyEntity_pub");
         ... etc
     }
}

Existe-t-il un moyen simple de faire cela pour les fichiers hbm intégrés ? La seule méthode à laquelle je pense serait d'avoir deux copies du fichier hbm, ce qui serait déroutant et loin d'être idéal.

Existe-t-il un meilleur moyen d'obtenir le même résultat ?

3voto

tolism7 Points 1857

En fait, ce que vous demandez est possible. Vous pouvez en fait accéder aux fichiers XML intégrés et modifier leur contenu avant que la SessionFactory ne soit construite (au démarrage de l'application).

En supposant que vous choisirez de référencer la table "t_MyEntity" dans vos entités par défaut, voici comment vous pouvez changer dynamiquement cette référence lorsque vous souhaitez référencer la table "v_MyEntity_pub" à la place (le code peut ne pas fonctionner tel quel mais vous aurez l'idée) :

    NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
    cfg.AddAssembly(ASSEMBLYNAME);

    if (NHibernateConfig.Current.Context != "intranet") //this is how you have stated you distinguish the intranet application from the other one.
    {
        string[] resourcesNames = assembly.GetManifestResourceNames();
        foreach (string resourceName in resourcesNames)
        {
            StreamReader sr = new  StreamReader(assembly.GetManifestResourceStream(resourceName));
            string resourceContent = sr.ReadToEnd();
            resourceContent = resourceContent.Replace("t_MyEntity", "v_MyEntity_pub");
            cfg.AddXmlString(resourceContent);
        }
     }

     ISessionFactory sessionFactory = cfg.BuildSessionFactory();

Le code ci-dessus ne doit être exécuté qu'une seule fois pendant toute la durée de vie de votre application et uniquement pour l'application intranet.

0voto

Jay Points 1450

Bien que ce ne soit peut-être pas la réponse la plus utile à votre problème, je ne pense pas que cela soit possible dans un fichier de cartographie. Je ne pense pas non plus que deux fichiers hbm fonctionneraient pour le même nom, car il serait incapable de faire la distinction entre les deux, vous devriez plutôt avoir deux objets identiques, chacun avec des noms et des fichiers de mapping légèrement différents. Ce qui, comme vous l'avez dit dans votre question, serait complètement déroutant et l'idéal serait simplement un point sur l'horizon que vous espériez, un jour, atteindre.

Pourquoi ne peut-on pas accéder à tout directement par la vue ? Je suppose qu'il n'y a pas d'écriture impliquée dans ce processus ? Y a-t-il un moyen de modifier cette méthode d'accès aux données tout en maintenant votre sécurité ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X