4

На моем веб-сайте я использую ASP MVC 2 + Fluent NHibernate как orm, StructureMap для контейнера IoC.Одиночный веб-сайт с несколькими строками с использованием asp mvc 2 и nhibernate

Существует несколько баз данных с идентичными метаданными (и поэтому сущности и сопоставления являются одинаковыми). На странице LogOn пользователь фиксирует логин, пароль, запоминает и выбирает свой сервер из выпадающего списка (фактически он выбирает базу данных).

Web.config содержит все connstrings, и мы можем предположить, что они не будут изменены во время выполнения.

Я полагаю, что для каждой базы данных требуется одна фабрика сеансов.

Перед использованием нескольких баз данных, я загружен классы в мое StructureMap ObjectFactory в Application_Start

ObjectFactory.Initialize(init => init.AddRegistry<ObjectRegistry>()); 
ObjectFactory.Configure(conf => conf.AddRegistry<NhibernateRegistry>()); 

NhibernateRegistry класс:

public class NhibernateRegistry : Registry 
{ 
    public NhibernateRegistry() 
    { 
     var sessionFactory = NhibernateConfiguration.Configuration.BuildSessionFactory(); 

     For<Configuration>().Singleton().Use(
      NhibernateConfiguration.Configuration); 
     For<ISessionFactory>().Singleton().Use(sessionFactory); 
     For<ISession>().HybridHttpOrThreadLocalScoped().Use(
      ctx => ctx.GetInstance<ISessionFactory>().GetCurrentSession()); 
    } 

} 

В Application_BeginRequest я связываю открыл NHibernate сессии Asp сеанс (NHibernate сессии для каждого запроса) и в EndRequest i развязать их:

protected void Application_BeginRequest(
     object sender, EventArgs e) 
    {    
      CurrentSessionContext.Bind(ObjectFactory.GetInstance<ISessionFactory>().OpenSession());    
    } 

Q1: Как я могу понять, что должен использовать SessionFactory в соответствии с аутентифицированным пользователем? - это что-то вроде UserData, заполненного именем базы данных (я использую простое FormsAuthentication)

Для регистрации я использую log4net, а именно AdoNetAppender, который содержит connectionString (в xml, конечно). Q2: Как я могу управлять несколькими строками подключения для этого приложения базы данных, поэтому журналы будут записываться в текущую базу данных? Я не знаю, как это сделать, кроме изменения xml все время и перепродажи xml-конфигурации, но это действительно плохое решение.

ответ

1

Я полагаю, что для каждой базы данных требуется одна фабрика сеансов.

Нет; вы можете отлично справиться с одной фабрикой сеансов для обеих баз данных.

Вы только что предоставили открытое IDbConnection в качестве параметра для метода OpenSession()ISessionFactory.

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

Если вам нужен кэш второго уровня, вам необходимо реализовать свой собственный DriverConnectionProvider и предоставить его с помощью бесплатного метода n12 Provider<TYourDriverConnectionProvider>().

+0

Ваше решение звучит очень убедительно, попробуйте в течение нескольких дней. Кэш второго уровня не является существенным. – jjjjj

 Смежные вопросы

  • Нет связанных вопросов^_^