アプリケーションブート時間に利用できないログインユーザーのように「ランタイム」依存関係を挿入する方法は?
-
08-10-2019 - |
質問
私はこれを手に入れていません:
Java GWTアプリでジンを使用してDIを実行します。ログイン画面は、アプリケーション全体のウィンドウに統合されています。ユーザーがログインした後、私が作成したGUIプレゼンターのような他のクラスにユーザーオブジェクトを注入したいので、何らかのランタイム依存関係があると思います。それ、どうやったら出来るの?
私が考えることができる1つの解決策は、次のようなsthです。
class Presenter {
@Inject
Presenter(LoggedInUserFactory userFactory) {
User user = userFactory.getLoggedInUser();
}
}
class LoggedInUserFactoryImpl {
public static User user;
User getLoggedInUser() {
return user;
}
}
したがって、ユーザーが正常にログインして、staticプロパティを設定したオブジェクトがある場合 LoggedInUserFactory
, 、しかし、これは機能します Presenter
ユーザーがログに記録された後に作成されます。
または、グローバルな静的レジストリを使用する必要がありますか?私はクラスに静的依存関係を持っているという考えが好きではありません。
どんな入力も大歓迎です。
解決
ユーザーに供給するために後方にdiを曲げる代わりに、 EventBus ユーザーがログインしたときにイベントを発射します。
これにDIを絶対に使用する必要があり、ユーザーが必要とするプレゼンターが使用されていない場合は、非ヌルユーザーで適切に初期化されるまで使用されない場合、通話を延期できます GWT.create(MyGinjector.class)
ユーザーがログインされるまで。その後、アプリケーションに2つのそのような呼び出しがあります。1つはログインコードパス用、および残りのアプリケーション用に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);
編集: ユーザー変数を設定するために、クライアントコードは次のようなバインディングを介してユーザーパバイダークラスのインスタンスを取得できます。
bind(UserProvider.class).in(Singleton.class);
...これは、クライアントコードがこれを行うことを可能にします:
injector.getInstance(UserProvider.class).user = new User(...)