1

Dagger を既存の Web アプリケーションに追加しようとしていますが、設計上の問題が発生しています。

現在、ハンドラーは次のようなディスパッチャーで作成されています

registerHandler('/login', new LoginHandler(), HttpMethod.POST)

ログインハンドラー内で、次のような関数を呼び出すことができます

Services.loginService.login('username', 'password'); 

loginService をハンドラーに挿入できるようにしたいのですが、最善の方法を見つけるのに苦労しています。ディスパッチャーには非常に長いハンドラーのリストがあり、それらすべてをインスタンス変数として挿入すると、大量のコードを追加するように見えます。

この種の問題の解決策はありますか?

4

1 に答える 1

0

さまざまなサービスを注入することについてのコメントに基づいています。次の解決策を提案します。

サービスプロバイダー:

@Module(injects = {LoginHandler.class, LogoutHandler.class})
public class ServicesProvider {
    @Provides @Singleton public LoginService getLoginService() {
        return new LoginService();
    }
}

LoginHandler.java :

public class LoginHandler extends Handler {
   @Inject LoginService loginService;
}

HttpNetwork.java

public class HttpNetwork extends Network {
    private ObjectGraph objectGraph = ObjectGraph.create(new ServicesProvider());

    public registerHandler(String path, Handler handler, String methodType) {
       getObjectGraph().inject(handler);
    }
}

このソリューションには 1 週間のポイントがありますServiceProvider。テスト目的 (またはその他の種類の目的) で簡単に変更することはできません。ただし、それも注入すると (たとえば、別のオブジェクト グラフを使用して、または単にコンストラクターを介して)、この状況を修正できます。

于 2013-11-10T08:59:31.607 に答える