2

私はこれを取得していません:

私はJavaGWTアプリでGinを使用してDIを実行しています。ログイン画面は、アプリケーションウィンドウ全体に統合されています。ユーザーがログインした後、作成したGUIプレゼンターなどの他のクラスにユーザーオブジェクトを挿入したいので、実行時の依存関係があると思います。それ、どうやったら出来るの?

私が考えることができる1つの解決策は次のようなものです:

class Presenter {
  @Inject
  Presenter(LoggedInUserFactory userFactory) {
     User user = userFactory.getLoggedInUser();
  }
}

class LoggedInUserFactoryImpl {
  public static User user;
  User getLoggedInUser() {
    return user;
  }
}

したがって、ユーザーが正常にログインし、オブジェクトを持っている場合、静的プロパティを設定しますが、これは、ユーザーがログインした後に作成されたLoggedInUserFactory場合にのみ機能しますが、そうではありません。Presenter

または、グローバル静的レジストリを使用する必要がありますか?クラスに静的な依存関係があるという考えは好きではありません。

どんな入力でも大歓迎です。

4

2 に答える 2

2

DIを後方に曲げてユーザーに提供する代わりに、EventBusを使用して、ユーザーがログインしたときにイベントを発生させます。

これに絶対にDIを使用する必要があり、null以外のユーザーで適切に初期化されるまでユーザーを必要とするプレゼンターが使用されない場合はGWT.create(MyGinjector.class)、ユーザーがログインするまで呼び出しを延期できます。アプリケーション:1つはログインコードパス用で、もう1つはアプリケーションの残りの部分用です。

于 2011-01-07T20:20:00.663 に答える
2

プロバイダーインターフェイスを使用できます。

class Presenter {
  @Inject
  Presenter(Provider<User> userProvider) {
     User user = userProvider.get();
  }
}

class UserProvider implements Provider<User> {
  public User user;
  User get() {
    return user;
  }
}

次に、モジュールには次のようなプロバイダーバインディングがあります。

bind(User.class).toProvider(UserProvider.class);

編集:ユーザー変数を設定するために、クライアントコードは次のようなバインディングを介してUserProviderクラスのインスタンスを取得できます。

bind(UserProvider.class).in(Singleton.class);

...これにより、クライアントコードでこれを実行できるようになります。

injector.getInstance(UserProvider.class).user = new User(...)
于 2011-01-08T20:22:30.787 に答える