2

PicoContainer を DI メカニズムとして使用して Waffle Framework で自分で開発したアプリケーションを、フレームワークとして Struts2 を使用し、DI メカニズムとして Guice を使用する新しい「スタック」に変換する作業を担当しました。痛みを最小限に抑えながら、新しいフレームワークと DI メカニズムの両方を最大限に活用する方法について、役立つ指針を持っている人はいますか?

よろしくお願いします。

4

1 に答える 1

3

そうです、質問は少し曖昧だったと思いますが、最終的にはそれを成し遂げました。DIのWaffle/Picoメカニズムは、レジストラと呼ばれるクラスを利用して、注入するクラスとそのスコープをWebアプリケーション内に設定します。彼らのサイトの例は次のとおりです。

 public class MyRegistrar extends AbstractRegistrar {  

   public MyRegistrar(Registrar delegate) {  
     super(delegate);  
   }  

   public void application() {  
     register("helloworld", HelloWorldController.class);  
   }  
 } 

この例は、アプリケーションスコープのクラスを示しています。セッションスコープとリクエストスコープの場合は、関連するメソッドsession()またはrequest()メソッド内に配置するだけです。

Struts2とGuiceでは、物事の構造が少し異なります。Guiceを最初に取り上げると@Inject、コンストラクターの上のアノテーションを使用して依存関係を挿入します。インジェクションの設定は、モジュールと呼ばれるクラスを介して行われます。モジュールは、configure()インターフェースをクラスにバインドするために呼び出されるメソッドをオーバーライドする必要があります。Googleの例を以下に示します。

public class BillingModule extends AbstractModule {
  @Override 
  protected void configure() {
    bind(TransactionLog.class).to(DatabaseTransactionLog.class);
    bind(CreditCardProcessor.class).to(PaypalCreditCardProcessor.class);
    bind(BillingService.class).to(RealBillingService.class);
  }
}

これらのモジュールでは、スコープも構成されます。シングルトンは事実上アプリケーションスコープのクラスであり、次のように指定できます。

bind(TransactionLog.class).to(InMemoryTransactionLog.class).in(Singleton.class);

しかし、Guiceも持っSessionScoped.classRequestScoped.classいるので、移行はかなり簡単です。

Struts2に関しては、そこで使用された依存性注入は、実際には最終的にGuiceになったものの初期バージョンであったため、この行をstruts.xmlに追加することが問題になります。

<constant name="struts.objectFactory" value="guice" />

そして、web.xmlでStrutsPrepareAndExecuteFilterを指定します

<filter>         
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class>
</filter>     
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/* </url-pattern>
</filter-mapping>

これは、同様のセットアップの問題を抱えている人を始めるのに十分なはずです。

于 2009-08-27T22:17:53.297 に答える