Внедрение правильного ISessionFactory в IRepository с использованием Castle Windsor и NHibernate Facility - PullRequest
2 голосов
/ 02 июня 2011

У меня есть три базы данных SQL Server, из которых одно приложение получает данные.Я использую NHibernate для извлечения данных из разных баз данных.У меня все настроено так, что каждая база данных имеет свой собственный репозиторий и сопоставления классов в своей сборке.В моем файле castle.config у меня есть настройка соединений с базой данных с помощью Castle NHibernate Facility:

<?xml version="1.0" encoding="utf-8" ?>
<castle>
  <facilities>
    <facility id="factorysupport" type="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.Windsor" />
    <facility id="nhibernate" isWeb="false" type="Castle.Facilities.NHibernateIntegration.NHibernateFacility, Castle.Facilities.NHibernateIntegration">
      <factory id="databaseone.factory" alias="databaseone">
        <settings>
            <!--Settings Here -->
        </settings>
        <assemblies>
           <assembly>DAL.DatabaseOne</assembly>
        </assemblies>
      </factory>
      <factory id="databasetwo.factory" alias="databasetwo">
        <settings>
          <!--Settings Here -->
        </settings>
        <assemblies>
          <assembly>DAL.DatabaseTwo</assembly>
        </assemblies>
      </factory>
      <factory id="databasethree.factory" alias="databasethree">
        <settings>
            <!--Settings Here -->
        </settings>
        <assemblies>
             <assembly>DAL.DatabaseThree</assembly>
        </assemblies>
      </factory>
    </facility>
  </facilities>
</castle>

Во всех моих репозиториях есть конструктор, который принимает ISessionFactory в качестве параметра:

public MyRepository<T> : IRepository<T>
{
   public MyRepository(ISessionFactory factory)
   {
        //Do stuff here
   }
 }

У меня есть класс установщика, в котором я хотел бы определить различные репозитории:

//In install method of IWindsorInstaller
container.register(Component.For(typeof(IRepository<>)).ImplementedBy(typeof(MyRepository<>));

При использовании одной базы данных все работает хорошо.Когда я добавляю в базу данных вторую базу данных, одна и та же ISessionFactory внедряется во все репозитории.Мой вопрос, каков наилучший способ справиться с этим?Я мог бы вручную указать, какой ISessionFactory должен быть внедрен в какой репозиторий <>, но я не могу найти документацию по этому вопросу.Лучший способ был бы, если бы я мог сказать что-то вроде: Для всех отображений классов в сборке DAL.DatabaseOne всегда вставляйте ISessionFactory, соответствующий databaseone.factory;и для всех отображений классов в сборке DAL.DatabaseTwo всегда вставляйте ISessionFactory, соответствующий databasetwo.factory.

Мысли или предложения?

1 Ответ

0 голосов
/ 02 июня 2011

Это объясняется в этой публикации Фабио Мауло ближе к концу под заголовком «Настройка ваших DAO / репозитория для нескольких БД».

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

...