我正在调整我的项目,特别是使用DI - Dagger。我没有注入类的问题,但是你如何'注入'运行时生成的变量?
说,我想存储用户的登录会话对象,其中包含api-token
,loggedUsername
等内容。当用户成功登录时,此对象在运行时生成,在另一个负责这样做的类中生成。
作为一个例子,我想要的只是做这样的事情:
public class FooPresenter {
...
Session mSession;
@Inject FooPresenter(Session session, ...) {
mSession = session;
...
}
...
}
提前致谢!
答案 0 :(得分:3)
我最后声明了一个方法来获取我的会话,在成功登录后,我在Dagger模块类中将其保存为String
中的SharedPreferences
。
这样,我可以在任何需要的地方注入会话。
这是我的SessionDomainModule
:
@Module(
library = true,
complete = false)
public class SessionDomainModule {
// TODO: Rethink this implementation.
@Provides
public Session provideSession(Application application) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(application);
String sessionJString = preferences.getString(AppConfig.PREF_KEY_CURRENT_SESSION, "");
Session session;
if(!"".equals(sessionJString)) {
return new Gson().fromJson(sessionJString, Session.class);
}
return null;
}
...
}
通过这样做,我可以实现我想要的东西,并且我的问题上的代码可以最终起作用。
答案 1 :(得分:2)
您可以使用SessionModule
来保留对当前Session
@Module
class SessionModule {
@Nullable
private Session mSession;
@Provides Session provideSession() {
return mSession;
}
void setSession(Session session) {
mSession = session;
}
}
但是,您需要引用此SessionModule
来更新会话对象。
另一种方法是创建一个(单例)SessionProvider
,这只能保留Session
:
@Singleton
class SessionProvider {
Session session;
@Inject
SessionProvider() {
}
}
然后,您将注入Session
,而不是注入SessionProvider
实例,您可以从中Session
检索/更新.state('database.home', {
url: '/home',
templateUrl: "app/Database/Home/home.html",
controller: "DatabaseHomeController"
})
。