ひがやすを技術ブログ

電通国際情報サービスのプログラマ

S2とTapestryとの連携

http://d.hatena.ne.jp/masataka_k/20040322#p6より


//とりあえずPageSource#getPage(IRequestCycle,String,IMonitor)が候補
public IPage getPage(IRequestCycle cycle, String pageName, IMonitor monitor) {
IPage page = super.getPage(cycle, pageName, monitor);
pageInjectBegin(monitor, pageName);
try {
container_.injectDependency(page, pageName);
} catch(ComponentNotFoundRuntimeException e) {
pageInjectException(monitor, pageName, e);
}
pageInjectEnd(monitor, pageName);
return page;
}
super.getPage()した後に、container_.injectDependency(page, pageName);
を呼び出すと、IPageはプールされているので、
initMethodが複数回呼び出されたときに問題がおきそうです。
PageSource#getPageを丸ごとオーバーライドして、
result = loader.loadPage(...)の直後に
container_.injectDependency(page, pageName);
を呼び出すということでどうでしょう。
PageLoader.instantiatePage()がオーバーライドできれば、
injectDependencyも要らなくなるのだけど。
#おしい、privateだ
とりあえず、PageLoaderを丸ごと置き換えることで対応し、
Tapestryの開発者に、instantiatePage()をオーバーライドできるように
頼むという方が、他のIoCコンテナのことを考えるといい気がします。
PageLoader.loadPageをオーバーライドし、privateフィールドへの
アクセスは、Reflectionを使うというのも、とりあえずの対応ならありかも。
後、JWCでもDependency Injectionが必要だというのが良く飲み込めていません。
PageLoader.instantiateComponent()がオーバーライドできれば、
なんとかなるのかも。