2

1 つのアプリケーションがデータを取得する 3 つの SQL Server データベースがあります。NHibernate を使用して、さまざまなデータベースからデータを取得しています。各データベースが独自のアセンブリに独自のリポジトリとクラス マッピングを持つようにセットアップしました。Castle.config ファイルでは、Castle NHibernate 機能を使用してデータベース接続をセットアップしています。

<?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<>));

1 つのデータベースを使用すると問題なく動作します。2 番目のデータベースをミックスに追加すると、同じ ISessionFactory がすべてのリポジトリに挿入されます。私の質問は、これを処理する最良の方法は何ですか? どの ISessionFactory をどの Repository<> に注入する必要があるかを手動で指定できますが、これに関するドキュメントが見つからないようです。最善の方法は、次のようなことを言うことができる場合です。アセンブリ DAL.DatabaseOne のすべてのクラス マッピングに対して、databaseone.factory に対応する ISessionFactory を常に注入します。また、アセンブリ DAL.DatabaseTwo のすべてのクラス マッピングに対して、databasetwo.factory に対応する ISessionFactory を常に注入します。

考えや提案はありますか?

4

1 に答える 1

0

This is explained in this post by Fabio Maulo toward the end under the heading 'Configuring your DAOs/Repository for multiple DB'.

He maps the factory individually for each domain class but you could also use reflection on each of the domain assemblies in your case to register the appropriate factory.

于 2011-06-02T01:41:50.553 に答える