[Seasar-user:2117] Re: injectDependencyについて

Koichi Kobayashi koichik
2005年 6月 7日 (火) 00:40:18 JST


小林 (koichik) です.

On Mon, 06 Jun 2005 10:45:35 +0900
Masataka Kurihara <[E-MAIL ADDRESS DELETED]> wrote:

> > public interface ResourceResolver {
> >     void setServletContext(ServletContext servletContext);
> >     InputStream getInputStream(String path);
> > }
> 
>   setServletContextはAPIにはいらないんじゃないかなと思い
> ますけど。。。

リフレクションしたくなかったので付けたのですが,外します.
# というか,昨夜 ML に投げた後に外しちゃったのですが.

> まあ、すでに本体がサーブレットAPIに侵食されて
> いるからどっちでもいいか。。。私は今からでも、Deployerモデル
> を整理すれば、サーブレットAPIを仕様変えなくても分離できると
> 思ってるので、それもいっしょに考えたい。

それはちょっと今更な感じ.S2.1 を出す前のタイミングだったら
ともかく,現時点で考える意義があるとは思えません.
おそらく S2 の利用者のほとんどが Web アプリケーションを
開発していることも考えると,ここで Servlet API を抽象化するような
方向は不必要な抽象化ではないでしょうか?

非 Web アプリケーションを開発している人にとっては servlet-api.jar が
不要になると精神衛生上好ましいかもしれませんが,それ以上のメリットが
あるとは思えません.

ちなみに S2JMS の受信系 (つまり非 Web アプリ) では,JMS メッセージに
HttpServletRequest の皮を被せることを考えています.
それによって,JMS メッセージのプロパティに設定されたオブジェクトを
instance="request" で扱えるようにしようという魂胆です.
ここでのポイントは,例えば Map のような汎用インタフェースの下に
HttpServletRequest や javax.jms.Message を使った実装を配置するという
ありきたりな考え方に囚われるのではなく,HttpServletRequest を
共通のインタフェースとして利用すると考えることでしょう.
非 Web アプリケーションで request スコープを使いたければ,
HttpServletRequest を implements した固有の実装クラスを
提供すればいいのです.S2JMS がそうしようと考えているように.

余談ですが,昔の RAM ディスクと後のメモリマップトファイルを思い出しました.
RAM ディスクはディスクのインタフェースでメモリにアクセスしていましたが,
メモリマップトファイルではそれが逆転して,インタフェースがメモリで
実装がディスクになります.
どちらが優れているか (有益か) はコンテキストに依存します.

普通なら Map のような汎用のインタフェースの下に HttpServletRequest や
HttpSession を使用する実装を配置することを考えるのは自然だと思います.
しかし,Web アプリがデファクト的な位置にあるというコンテキストでは,
発想を逆転させて HttpServletRequest や HttpSession が標準の
インタフェースで,必要ならその下に Map を使った (モックのような)
実装や,JMS の Message を使った実装があってもいいのではないでしょうか?
そうすることにより,コンテナは Servlet API で利用可能な機能を全て
利用できる潜在能力を持つことになります (実際に使うかどうかは別として).
当然,Servlet API に足りない機能を使うことはできませんが,Web アプリが
大勢を占める状況では,そのようなニッチな機能をコンテナが直接サポートする
必要があるとは考えにくく,問題になることはまずないと思います.

-- 
<signature>
    <name>Koichi Kobayashi</name>
    <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>




Seasar-user メーリングリストの案内