2009-08-11 9 views
2

私はWaffleフレームワークで自分自身で開発したアプリケーションを、DIメカニズムとしてStruts2をフレームワークとして使用する新しい "スタック"にDIメカニズムとして変換することを任されましたDIメカニズムとしてGuiceと一緒に。誰もそこに誰も最小限の痛みでこれを行うと同時に、新しいフレームワークとDIメカニズムの両方を最大限に活用するための有用なポインターがありますか?Waffle/PicoからStruts2/Guiceへの変換

事前に感謝します。

答えて

3

私は少し曖昧だったのですが、最後にやりました。 DI用のWaffle/Picoメカニズムは、レジストラと呼ばれるクラスを使用して、注入するクラスとそのWebApp内のスコープを設定します。自分のサイト上の例は次のとおりです。

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のになったものの初期のバージョンが実際にあった使用ので、

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

とでStrutsPrepareAndExecuteFilterの指定をstruts.xmlするために、この行を追加することの問題となりweb.xml

<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> 

これは、同様のセットアップの問題が発生した人には十分なはずです。

関連する問題