質問

GWT-DispatchとGuiceに関していくつか質問があります。 Guice 2.0、GWT-Dispatch 1.1.0 Snapshot、MVP4G 1.1.0およびGin 1.0を使用しています

まず、単純なアクション、結果、ハンドラーを定義しました。

ListContactsaction.java

public class ListContactsAction implements Action<ListContactsResult>{

    public ListContactsAction() {
    }

}

ListContactsResult.java

public class ListContactsResult implements Result {

    private List<Contact> contactList;

    public ListContactsResult() {
    }

    public ListContactsResult(List<Contact> contactList) {
        this.contactList = contactList;
    }

    public List<Contact> getContactList() {
        return contactList;
    }
}

ListContactShandler.java

public class ListContactsHandler implements ActionHandler<ListContactsAction, ListContactsResult>{

    @Inject
    private SqlSessionFactory factory;

    public Class<ListContactsAction> getActionType() {
        return ListContactsAction.class;
    }

    public ListContactsResult execute(ListContactsAction a, ExecutionContext ec) throws DispatchException {
        // some code using SqlSessionFactory and returning ListContactResult
        // with list of contacts
    }

    public void rollback(ListContactsAction a, ListContactsResult r, ExecutionContext ec) throws DispatchException {
        /* get action - no rollback needed */
    }

}

コマンドパターンの代わりにRPCサービスを使用していた私のアプリの以前のバージョンでは、提供する方法がありました SqlSessionFactory 注射のために、このようなもの:

@Provides
    public SqlSessionFactory getSqlSessionFactory(){
        // some code here
    }

私はGWT-Dispatchを始めて、私の行動とそのハンドラーの間に拘束力を提供しなければならないことを始めました。

public class ContactModule extends ActionHandlerModule{
    @Override
    protected void configureHandlers() {
        bindHandler(ListContactsAction.class, ListContactsHandler.class);
    }
}

しかし、GWT-Dispatchサイトからのこの例は、GUICEですべての配線を行うのに問題があります。

public class DispatchServletModule extends ServletModule {
    @Override
    public void configureServlets() {
        serve( "/path/to/dispatch" ).with( DispatchServiceServlet.class );
    }
}

noがあるので、動作しません DispatchServiceServlet パッケージで。

私の質問は次のとおりです。

  • DispatchServletModuleとそれをどのように進めるかをどのように書く必要がありますか(私がパスに仕えるべきもので)
  • 私のアプリのweb.xmlファイルに何を入れて、ジンが注入したプレゼンターからアクションを正しく実行できるようにする必要があります DispatcherAsync 実装
  • どこに置くべきですか SqlSessionFactory SQLSessionFactoryが必要な場所に注入できるようにする方法(モジュール)を提供する
  • インジェクターをインスタンス化する方法で、他のアクションハンドラーで適切に使用できるようにします

それがすべてだと思います、そして私は自分自身を明らかにしました。何かが十分に明確でない場合は、より具体的にするようにします。

正しい解決策はありません

他のヒント

GuiceservletConfigクラスを作成しましたか?これは、Dispatch ServletモジュールとGuiceを使用したアクションハンドラーモジュールをセットアップする場所です。

plubic class GuiceServletConfig extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new HandlerModule(), new DispatchServletModule());
    }
}

HandLermoduleはActionHandlerモジュールクラスであるため、コードからContactModuleクラスを配置します。

SQLSessionFactoryの場合、ContactModuleでバインディングをセットアップできます。コードでは、すべてのサービスとアクションハンドラーのバインディングをセットアップするServerModuleが1つしかありません。これは主に簡単なためです。

GWT-Platformフレームワークは、GWT-Dispatchフォークを使用してRPC要求を処理します。 DispatcherとGuiceを真剣に使用していると考えている場合、おそらく自分自身をWtiteしなければならなかったコードがたくさんあります。強くお勧めします。

まず、私は同情します。これをすべてまとめることは、どの場所にも文書化されていません。私はあなたの質問のそれぞれに順番に答えます。そのいずれかが不明である場合は、私の答えにコメントを追加してください。

QU:DispatchServletModuleとそれをどのように作成するか(パスにサービスを提供する必要がある)をどのように書く必要がありますか?

net.customware.gwt.dispatch.server.guiceパッケージには、guicestanddispatchservletクラスがあります。それを使用してください。理由は100%確信していませんが、使用するパスにはGWTモジュールの名前が含まれ、その後に「/ディスパッチ」が含まれています。あなたはそれを試す必要があるかもしれません。

public class MyServletModule extends ServletModule {
  @Override protected void configureServlets() {
    serve("/com.my.module.name/dispatch")
      .with(GuiceStandardDispatchServlet.class);
  }
}

QU:DispatcherAsyncの実装を挿入したプレゼンターからアクションを正しく実行できるように、アプリのWeb.xmlファイルに何を配置すればよいですか?

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <listener>
    <listener-class>com.myapp.whatever.MyContextListener</listener-class>
  </listener>
  ...
</web-app>

...そして、次のようにGuice Injectorを作成するカスタムコンテキストリスナーが必要です。アクションハンドラーにバインドするContactModuleを含めたことに注意してください。

public class MyContextListener extends GuiceServletContextListener {
  @Override protected Injector getInjector() {
    return Guice.createInjector(new MyServletModule(), 
      new ContactModule(), new SQLStuffModule());
  }
}

QU:sqlsessionFactory提供方法(どのモジュール)を必要な場所でsqlsessionFactoryを注入できるようにする必要がありますか?

前のコードスニペットに新しいSQLStuffModuleを含めたことに注意してください。それはあなたのsqlsessionFactoryバインディングを置くのに良い場所です。複数のモジュールには害はありません。さまざまな懸念がうまく分離されていることがわかりました。

QU:インジェクターをインスタンス化するには、他のアクションハンドラーで適切に使用できますか?

サーバー側については、上記のmyContextListenerコードスニペットを参照してください。

クライアント側では、このようなカスタムインジェクターインターフェイスが必要です。

@GinModules(StandardDispatchModule.class, MyClientModule.class)
public interface MyGinjector extends Ginjector {
  MyWidgetMainPanel getMainPanel();
}

...次のように、MVPのものをカスタムジンモジュールにバインドできます。 MVP4Gに精通していないことを申し訳ありませんが、モジュールクラスでビューとプレゼンターを一緒に配線する必要があると思います。

public class MyClientModule extends AbstractGinModule {
  @Override protected void configure() {
    bind(...).to(...);
    ...
  }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top