2010年1月28日木曜日

フレームワーク奮闘記 その3 ServiceMapって?

少し進展があった。
下記の様な構成でとりあえずモックを作ってみることにする。
Soil --> グローバルコントローラ
  Service --> サービスコントローラ
    Context --> コンテキスト(文脈)は何でもあり。
Soilは複数のアクションを持つわけだけど、そのアクションを特定する方法が今回の課題。
RailsだとRoutes.rbに相当する部分。
やはり、WebApplicationだからincoming request,output responseという概念は
代わり無いので、何かしらのリクエストをキーにするしか方法が無い。
今回、面倒なのは、
  • Soilは複数のアクションを持つ


  • 複数のActionは関連性を持つ


  • というところ。
    複数のアクションの関連性を定義する為に、地図が必要になるわけだ。
    Soilが何もかもしる必要は無いので、イメージとしてはSoilは地図を持って
    指定のサービスをつまみに行くイメージ。
    呼び出し口は下のようになるのかな?
    class Soil{
           public void dispatch(HttpServletRequest req){
                String param = req.getParameter('???');
                String serviceName = ServiceMap.find(param);
                Service srv = (Service) Class.forName(serviceName).newInstance();
                
                if("DONE" == service.getStatus()){
                      next();       
                }else if("PROGRESS" == service.getStatus()){
                     current();
                }else if("BACK" == service.getStatus(){
                     back();
                }else{
                     //error
                }
           }
       }
    
    この中のここをどのようにしていくか?
    String param = req.getParameter('???');
    String serviceName = ServiceMap.find(param);
    
    これが問題だ。

  • そもそも上記のように全てのリクエストをバイパスする必要があるのか?



  • リクエストを後段に渡すことで、サービスのインスタンスを作るのが役割だから。
    これは仕様が無いんだろうな。まだそこをどうラップするとかは考えてないけど。。。

    リクエストが必要だとすれば、判定すべきは最初のリクエストだけなのか?
    最初のクラス名さえ分かってしまえば、その後どのようにしていくのかは
    自ずと決まる。それを定義するのがServiceMapの役割だから。
    となると、もう少しコードの書き方も変わって来るのか?
    うーん、少し苦しくなってきた。考えがまとまったら、続きを書くことにしよう。