Как идентифицировать фабрику сеансов конкретной сущности с помощью свободно распространяемой базы данных NHibernate и нескольких баз данных - PullRequest
7 голосов
/ 23 апреля 2010

Вопрос следует из Свободный NHibernate + несколько баз данных (не нужно переходить по этой ссылке, здесь должно быть достаточно информации).

Моя проблема заключается в следующем:

Я использую Fluent NHibernate. Мое приложение использует несколько баз данных. Каждая база данных имеет свои собственные объекты, зарегистрированные (сопоставленные) против нее. В результате получается несколько сессионных фабрик, каждая из которых относится к одной БД, и каждая «содержит» свой собственный набор сопоставленных сущностей.

Для загрузки сущностей я создал общий класс Factory, который предоставляет несколько стандартных методов загрузки, которые можно использовать для любой зарегистрированной сущности (в любой БД). Проблема в том, что методы загрузки должны использовать правильную фабрику сеансов для класса сущностей, с которым я занят. Как определить, какую фабрику сессий мне нужно использовать? У меня есть все Session Factories «под рукой» (и проиндексированы по имени базы данных), мне просто нужен способ, зная только тип сущности, которую я собираюсь загрузить, выбрать правильную Session Factory для использования.

Например:

public IBaseBusinessObject CreatePopulatedInstance(Type boType, Guid instanceKey)
{
  IBaseBusinessObject result = null;
  ISessionFactory sessionFactory = GetSessionFactory(boType);
  using (ISession session = sessionFactory.OpenSession())
  {
    using (session.BeginTransaction())
    {
      result = (IBaseBusinessObject)session.Get(boType, instanceKey);
    }
  }
  return result;
}

Что нужно сделать в GetSessionFactory (boType)?

Спасибо за чтение!

1 Ответ

4 голосов
/ 23 апреля 2010

Я бы начал с рассмотрения метода ISessionFactory.GetClassMetaData.

IClassMetadata metadata = sessionfactory.GetClassMetadata(boType); 

Если вы можете поддерживать список ваших экземпляров ISessionFactory, вы можете перечислять их, пока не найдете тот, у которого есть метаданные для вашего типа boType.

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

Удачи

Нил.

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