[Seasar-user:4016] Re: 2つのプロジェクト間でのDIが行われない
吉岡 武志/インフォセンス
[E-MAIL ADDRESS DELETED]
2006年 7月 4日 (火) 10:11:20 JST
吉岡です。
> DI される側のコンポーネントはどの dicon に定義 (あるいは自動登録)
> していますか?
> そのコンポーネントが子供のコンテナにいると,まずはそのコンテナ
> つまり main 側の dicon からコンポーネントが検索されます.
test側に定義していると思っていますが、勘違いしているかもしれませんので
以下がdicon定義を記します。
[main側のdicon]
<component class
="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
<property name="autoNaming">
<component class
="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
</property>
<initMethod name="addClassPattern">
<arg>"jp.co.sample.dao"</arg>
<arg>".*Dao"</arg>
</initMethod>
</component>
[test側のdicon]
<include path="main側のdicon"/>
<component class
="org.seasar.framework.container.autoregister.ComponentAutoRegister">
<property name="autoNaming">
<component class
="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
</property>
<initMethod name="addClassPattern">
<arg>"jp.co.sample.dao"</arg>
<arg>".*Dao"</arg>
</initMethod>
<initMethod name="addReferenceClass">
<arg>@[E-MAIL ADDRESS DELETED]</arg>
</initMethod>
</component>
> test 側が DI されるようになったのではなく,main 側の
> JobDaoImpl が DI されているだけではないかと思います.
どちらの(main側 or test側)クラスがDIされたか分るように
ログを出力していたのですが、test側がDIされているようでした。
> おそらく,吉岡さんがやりたいことを実現するには dicon の
> 構成を変える必要があると思います.
> どんなコンポーネントがあり,どのコンポーネントに
> どのコンポーネントを DI したいのかを簡単に書き出して
> いただけないでしょうか?
小林さんとやりとりをさせて頂いて、私のdicon定義の仕方(考え方)が根本的に間
違っている
気がします。ただ、どこがどう間違っているかが私自身理解ができていませんので
以下に、どういったことがやりたいのか簡単に記述させて頂きます。
■パッケージ階層
[mainProject] -- Mainプロジェクト
+ jp.co.sample.dao
・JobDao.java
・JobDaoImpl.java
+ jp.co.sample.dbaccess
・CountryDao.java
+ jp.co.sample.service
・JobService.java
・JobServiceImpl.java
+ jp.co.sample.dicon
・実装用のdiconファイル(main.dicon)
[testProject] -- Testプロジェクト
+ jp.co.sample.dao
・MockJobDaoImpl.java
+ jp.co.sample.service
・JobServiceTestCase.java
+ jp.co.sample.dicon
・テスト用のdiconファイル(test.dicon)
・JobServiceTestCaseは、S2TestCaseを継承しておりJobServiceImplのTestを行う
ためのクラスです。
・JobServiceTestCaseでtest.diconを使用(include)したいです。
・JobServiceTestCaseにJobServiceImplをDIさせたいです。
・JobServiceImplに対してMockJobDaoImplをDIさせたいです。
また、CountryDaoを[dao.interceptor]としてDIさせたいです。
・main.diconには、mainProject配下のコンポーネント定義(AutoRegister)のみにし
たいです。
上記の内容を実現するためにtest.diconをどう最適に定義すればよいかで悩んでい
る次第です。
以下にやりたいことを簡単なJavaのソースで記述します。
[JobServiceTestCase.java]
public class JobServiceTestCase extends S2TestCase {
public JobService service = null;
public void testServiceTx() {
service.doJob();
}
protected void setUp() {
include("test.dicon");
}
}
[JobServiceImpl.java]
public class JobServiceImpl implements JobService {
private JobDao jobDao = null;
private CountryDao countryDao = null;
public setJobDao(JobDao jobDao) {
this.jobDao = jobDao;
}
public setCountryDao(CountryDao countryDao) {
this.countryDao = countryDao;
}
public void doJob() {
jobDao.print();
List list = countryDao.select();
}
}
[MockJobDaoImpl.java]
public class MockJobDaoImpl implements JobDao {
public void print() {
_/_/_/ test用の処理を実行 _/_/_/
}
}
[JobDaoImpl.java]
public class JobDaoImpl implements JobDao {
public void print() {
_/_/_/ main用の処理を実行 _/_/_/
}
}
よろしくお願いします。
- 以上 -
Seasar-user メーリングリストの案内