Один веб-сайт, несколько строк подключения, используя asp mvc 2 и nhibernate - PullRequest
4 голосов
/ 08 июня 2010

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

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

Web.config содержит все константы, и мы можем предположить, что они не будут изменены при запуске-time.

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

Перед использованием нескольких баз данных я загрузил классы в свой ObjectMactory StructureMap в 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 я их связываю:

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

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

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

1 Ответ

1 голос
/ 16 июня 2010

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

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

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

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

Если вам нужен кэш второго уровня, вам нужно реализовать свой собственный DriverConnectionProvider и предоставлять его через свободный nh'sProvider<TYourDriverConnectionProvider>() метод.

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