NCommon + Свободный NHibernate + Несколько баз данных?
Я пытаюсь подключить NCommon и NH к нескольким базам данных с помощью руководства по адресу http://codeinsanity.com/ (см. "Настройка NCommon для поддержки нескольких баз данных"), и это работает с помощью свободного подхода, предложенного ниже:
var configuration = NCommon.Configure.Using(adapter).ConfigureState<DefaultStateConfiguration>();
configuration.ConfigureData<NHConfiguration>(config => config.WithSessionFactory(() => _sessionFactories[0]).WithSessionFactory(() => _sessionFactories[1]));
Это работает, как и ожидалось, но, как вы можете видеть, фабрики сессии жестко закодированы. Что я действительно хотел бы сделать, это что-то вроде этого:
foreach(ISessionFactory sessionFactory in _sessionFactories)
{
configuration.ConfigureData<NHConfiguration>(config => config.WithSessionFactory(() => sessionFactory));
}
Но это бросает следующее исключение:
Компонент NCommon.Data.NHibernate.NHUnitOfWorkFactory не может быть зарегистрирован. Уже есть компонент с таким именем. Вы хотите изменить существующий компонент? Если нет, обязательно укажите уникальное имя.
Я надеюсь, что есть правильный способ подключить n-SessionFactories без их жесткого кодирования, но я просто не вижу решения. Любой совет?
1 ответ
Я думал, что получил это для работы, делегировав часть SessionFactory методу, как показано ниже:
configuration.ConfigureData<NHConfiguration>(config => ConfigureSessionFactories(config));
private void ConfigureSessionFactories(NHConfiguration configuration)
{
foreach (ISessionFactory sessionFactory in _sessionFactories)
{
configuration.WithSessionFactory(() => sessionFactory);
}
}
Однако это только кажется решением. Допустим, у вас есть несколько фабрик сессий, вы можете использовать все из них для запроса, но только фабрика сессий, добавленная последним, попадет в базу данных и выдаст результаты. Запросы к другим фабрикам сеансов никогда не попадут в действительную базу данных и вернут ноль объектов.
Единственный способ заставить это работать:
configuration.ConfigureData<NHConfiguration>(config => config.WithSessionFactory(() => _sessionFactories[0]).WithSessionFactory(() => _sessionFactories[1]));
Я бы предпочел не писать это жестко... Я бы предпочел перебрать цикл n-сессионных фабрик... У кого-нибудь есть идеи, как этого добиться?