Quillで複数データベースにアクセス
Quillで複数のデータベースにアクセスするための設定に手間取ったので
その結果を書いておきます。
複数のデータベース(データソース)に接続するために必要なものは
1.App.config内のdataSourcesタグにデータソースの設定を記述
Quillで簡単DI+AOP - S2Container.NET にあるように設定ファイル(App.config)の
「quill」セクション内の「dataSources」タグ内に各データソースの設定を書きます。
<dataSources> <!-- Oracle --> <dataSource name="Oracle"> <provider>Oracle</provider> <connectionString>...</connectionString> <class>Seasar.Extension.ADO.Impl.DataSourceImpl</class> </dataSource> <!-- PostgreSQL --> <dataSource name="PostgreSQL"> <provider>PostgreSQL</provider> <connectionString>...</connectionString> <class>Seasar.Extension.ADO.Impl.DataSourceImpl</class> </dataSource> </dataSources>
上の設定内容の中の
Seasar.Extension.ADO.IDataSourceに対する実装クラス名を指定する必要があり
データソース毎に別のクラスを指定しないといけません。
Seasar.Extension.ADO.Impl.DataSourceImplやSeasar.Extension.Tx.Impl.TxDataSourceImplの継承クラスをデータソース毎に作成し、コンストラクタを記述します。
koyakさんのご指摘によりカスタムデータソース実装クラスは不要であることがわかりました。
koyakさんありがとうございます。
2.データソース毎にSeasar.Quill.Dao.IDaoSetting実装クラスを作成する
public class OracleDaoSetting : Seasar.Quill.Dao.Impl.AbstractDaoSetting { protected override void SetupDao(IDataSource dataSource) { BasicCommandFactory commandFacoty = new BasicCommandFactory(); BasicDataReaderFactory dataReaderFactory = new BasicDataReaderFactory(commandFacoty); FieldAnnotationReaderFactory annotationReaderFactory = new FieldAnnotationReaderFactory(); _daoMetaDataFactory = new DaoMetaDataFactoryImpl( dataSource, commandFacoty, annotationReaderFactory, dataReaderFactory); _daoInterceptor = new S2DaoInterceptor(_daoMetaDataFactory); } public override String DataSourceName { get { return "Oracle"; } // App.config内のデータソース設定の<dataSource name="Oracle"> の記述に合わせる } }
3.DaoクラスにS2Dao属性を使用し、カスタム設定を適用させる
[S2Dao(typeof(OracleDaoSetting))] [Implementation] [Bean(typeof(HogeDto))] public interface IOracleDao { int insert(HogeDto dto); }
このような設定で複数のデータソースへのアクセスができました。