gpt4 book ai didi

android - @Produces 之后@Injects?

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:04 25 4
gpt4 key购买 nike

我正在尝试通过 Dagger 2 学习 DI 并将其应用到我们的产品中。用 @Singleton 注释的应用程序级别的东西足够简单(例如 SharedPreferences )。在考虑我们的架构时,有几个本质上是异步的依赖项,我想象它们的范围在 @ForSession。范围界定。

  • 我们的身份验证 token /帐户信息,从 Android AccountManager 获取.在现有有效 session 的情况下可以是同步的。如果没有现有 session 和 AccountManager 则可能是异步的必须显示完整的登录流程。
  • 一旦我们有了有效的 session token 和 session 信息:
    • 提供 Endpoint实现依赖关系,以便我们的网络层知道在哪里可以找到 API。
    • 从网络 API 获取我们的“用户”信息。
    • 从网络 API(或本地缓存)中提取额外的支持信息。
    • 从网络 API(或本地缓存)中提取本地化的后端字符串。
    • 让依赖于绑定(bind)的组件运行 Service .仅当绑定(bind) Service 时才异步提供该组件绑定(bind)完成。

表示层应该在收到这些项目的集合时被关闭。除了某种“正在加载”显示之外,如果没有上述任何一项,它就无能为力。

感觉这些依赖项适合 @ProducerModule 的用例和 @Produces .我觉得我可以 @Produces ListenableFuture<>每个依赖项的方法,可能带有 SettableFuture<>作为实现。执行任何需要的工作,请调用 set()在那个 future ,依赖性得到满足。

我对 Producers guide 中的这句话感到厌烦.

As in the above example, producer modules can be used seamlessly with ordinary modules, subject to the restriction that provided types cannot depend on produced types.

对于“一切可用的大门演示”,我可以设想一个复合对象可以得到 @Inject与展开的T的 future 。但这合法吗?

这是我最接近的一次,但它显式调用了组合的构造函数,而不是注入(inject)它。有没有办法做到这一点?

@ProducerModule
public class SessionModule {
@Produces
@ForSession
static ListenableFuture<User> produceSignedInUser(SessionManager sessionManager) {
return sessionManager.getSignedInUserFuture();
}

@Produces
@ForSession
static ListenableFuture<BoundService> produceBoundService(SessionManager sessionManager) {
return sessionManager.getBoundServiceFuture();
}

@Produces
@ForSession
static CompositeSessionInfo produceComposite(User user, BoundService service) {
return new CompositeSessionInfo(user, service);
}
}

然后是组件:

@ForSession
@ProductionComponent(modules = SessionModule.class)
public interface SessionComponent {
ListenableFuture<CompositeSessionInfo> getCompsiteSessionInfoFuture();
}

在我想进入的某个地方,我可以做类似的事情:

SessionComponent component = Dagger_SessionComponent.builder()
.executor(executor)
.build();

Futures.addCallback(component.getCompsiteSessionInfoFuture(),
new FutureCallback<CompositeSessionInfo> {
public void onSuccess(CompositeSessionInfo result) {
releaseTheHounds(result);
}
public void onFailure(Throwable t) {
reportError(t);
}
});

我对这部分的理解有偏差吗?顺便说一句:为什么 @Produces声明的方法 static ?这是必需的吗? (编辑:static 肯定不是必需的,但我不确定除了在 Module 中没有实例字段之外的 Intent 是什么)。

编辑:

我决定创建一个 proof of concept project从我的实际项目中抽象出我的想法。一切如我所愿除了我无法@Inject我的任何@Produce d 项目,最终结果“复合”数据或中间结果。如果我在组件中公开一个 setter/getter ,我就可以得到它们,这就是我所做的。

我目前的计划是拥有这个 @Producer基于异步的东西在一个单独的可注入(inject)模块中关闭,然后将结果依赖项输入一个@Provides提供其他地方的样式模块,以便它们可以是 @Inject编辑。

编辑编辑:

更新了概念证明,使其具有共同的前体依赖性,从而更接近地模仿我的需求。仍然不能@Inject。我相信这和我会得到的一样好。

最佳答案

好吧,看来我要单干了,所以我会发布我的最终结论作为我自己的答案,希望能帮助其他想做类似事情的人。

我更新了我的 proof of concept project再一次。现在,一旦满足所有异步依赖项,新的单一复合依赖项就是一个实际的@Module@Produced 由新重命名的SessionProductionComponent,然后该模块被注册为名为 SessionProvisionComponent 的组件。这个组件是一个标准的@Component,带有@Provide方法,通过标准的@Inject机制提供依赖。

@Produces
@ForSession
public SessionProvisionModule produceSessionProvisionModule(Application app, SomeAsyncDependency someAsyncDependency, AnotherAsyncDependency anotherAsyncDependency) {
SessionProvisionModule module = new SessionProvisionModule(someAsyncDependency, anotherAsyncDependency);
((App) app).createSessionProvisionComponent(module);
return module;
}

现在在 MainActivity 中,当我需要获取 session 信息时,它看起来像这样:

    App app = (App) getApplication();
sessionProductionComponent = app.getSessionProductionComponent();
if (app.getSessionProductionComponent() == null) {
sessionProductionComponent = app.createSessionProductionComponent(new SessionProductionModule());
}

Futures.addCallback(sessionProductionComponent.getSessionProvisionModuleFuture(),
new FutureCallback<SessionProvisionModule>() {
@Override
public void onSuccess(SessionProvisionModule result) {
app.getSessionProvisionComponent().inject(MainActivity.this);
}

@Override
public void onFailure(Throwable t) {
// handle failure
}
});

一旦 Future 成功,我就可以 inject() MainActivity 并且任何带注释的字段都可以 @Injected正如人们所期望的那样依赖。这样,我实际上可以在@Produce之后有@Inject

没有我想要的那么干净,但仍然比没有 DI 好。现在,可以以任何顺序满足任意数量的异步依赖项,在任何时间范围内运行,一旦所有这些都准备就绪,就会设置一个 Future 并准备好 SessionProvisionComponent使用那些 @Produced 依赖项注入(inject)依赖项。

很高兴。

关于android - @Produces 之后@Injects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35617378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com