NHibernate: использование немного разных файлов отображения hbm в зависимости от контекста - PullRequest
1 голос
/ 16 декабря 2009

Одно из моих приложений - общедоступный веб-сайт, другое - интранет. Общедоступный веб-сайт работает с использованием пользователя с ограниченной защитой, который должен обращаться к определенной таблице через представление, тогда как интрасеть может обращаться к самой таблице.

Кажется, что это было бы довольно просто настроить с помощью Fluent NHibernate. В моей ClassMap я мог бы сделать проверку, как это:

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

Есть ли простой способ сделать это для встроенных файлов hbm? Единственный способ, о котором я могу подумать, - это иметь две копии файла hbm, что может привести к путанице и далеко от идеала.

Возможно, есть лучший способ достичь того же результата?

Ответы [ 2 ]

3 голосов
/ 16 декабря 2009

На самом деле то, что вы спрашиваете, возможно. На самом деле вы можете получить доступ к встроенным XML-файлам и изменить их содержимое перед сборкой SessionFactory (при запуске приложения).

При условии, что вы по умолчанию решите ссылаться на "t_MyEntity" в ваших сущностях, вы можете динамически изменить эту ссылку, если вместо этого вы захотите ссылаться на таблицу "v_MyEntity_pub" (код может не работать, как есть, но вы будете получить представление):

    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();

Приведенный выше код должен выполняться только один раз за время существования вашего приложения и только для приложения интрасети.

0 голосов
/ 16 декабря 2009

Хотя это, возможно, не самый полезный ответ на вашу проблему, я не верю, что это возможно в файле отображения. Я также не думаю, что два файла hbm будут работать для одного и того же имени, поскольку он не сможет различить два, вместо этого вам придется иметь два одинаковых объекта, каждый из которых имеет несколько разные имена, и файлы сопоставления. Который, как вы сказали в своем вопросе, был бы совершенно запутанным, и идеальным было бы просто место на горизонте, которого вы надеетесь когда-нибудь достичь.

Почему это не может получить доступ ко всему напрямую через представление? Я предполагаю, что нет никакого письма, вовлеченного в этот процесс? Можно ли каким-либо образом изменить этот метод доступа к данным, сохраняя при этом вашу безопасность?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...