使用Dagger注入登录会话

时间:2015-06-11 07:36:07

标签: java android dependency-injection dagger

我正在调整我的项目,特别是使用DI - Dagger。我没有注入类的问题,但是你如何'注入'运行时生成的变量?

说,我想存储用户的登录会话对象,其中包含api-tokenloggedUsername等内容。当用户成功登录时,此对象在运行时生成,在另一个负责这样做的类中生成。

作为一个例子,我想要的只是做这样的事情:

public class FooPresenter {
    ...

    Session mSession;

    @Inject FooPresenter(Session session, ...) {
        mSession = session;
        ...
    }

    ...
}

提前致谢!

2 个答案:

答案 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" })