@Produces之后的@Injects吗?

布赖恩·杜普依斯(Brian Dupuis)

我正在尝试通过Dagger 2学习DI,并将其应用于我们的产品。带有注释的应用程序级的东西@Singleton非常简单(例如SharedPreferences)。在考虑我们的体系结构时,有一些本质上是异步的依赖项,我想这些依赖项的@ForSession范围很广。

  • 从Android获取的我们的身份验证令牌/帐户信息AccountManager在现有有效会话的情况下可以同步。如果没有现有会话,AccountManager并且必须显示完整的登录流程,则可以是异步的
  • 获得有效的会话令牌和会话信息后:
    • 提供一个Endpoint满足相关性的要求,以便我们的网络层知道在哪里可以找到API。
    • 从网络API获取我们的“用户”信息。
    • 从网络API(或本地缓存)中提取其他支持信息。
    • 从网络API(或本地缓存)中提取本地化的后端字符串。
    • 获取依赖于bound的组件Service仅在绑定Service绑定完成时异步提供该组件

表示层应在收到这些项目的集合后进入。除了某种“正在加载”的显示之外,没有以上任何显示都无法做很多事情。

感觉这些依赖关系适合于@ProducerModuleand的用例@Produces我觉得我可以@Produces ListenableFuture<>为每个依赖项提供方法,也许有一个SettableFuture<>实现。执行所需的任何工作,呼吁set()未来,就可以满足依赖性。

我讨厌的是生产者指南中的这句话

如上面的示例所示,生产者模块可以与普通模块无缝使用,但要受到限制,即提供的类型不能取决于生产的类型。

对于“关于所有可用东西的门口演示”,我可以设想一个复合对象,该对象可以@InjectT期货的解约一起使用但这甚至合法吗?

这是我最接近的方法,但它明确地调用了复合方法的构造函数,而不是注入它。有办法做这种清洁剂吗?

@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

编辑:

我决定创建一个概念证明项目,从我的实际项目中抽象出我的想法。一切都按我的要求进行,只是我无法处理@Inject任何@Produced项目,无论是最终结果“复合”数据还是中间结果。如果在组件中公开吸气剂,则可以得到它们,这就是我所做的。

我目前的计划是将@Producer基于异步的东西放在一个单独的可注入模块中,然后将生成的依赖项输入到一个@Provides样式模块中,该模块在其他地方输入以便可以对其进行@Inject编辑。

编辑编辑:

更新了概念验证,使其具有共同的先验依赖关系,以更紧密地模仿我的需求。仍然不能@Inject。我相信这会尽我所能。

布赖恩·杜普依斯(Brian Dupuis)

好吧,既然看来我会自己去做,我将发布自己的最终结论作为我自己的答案,以希望能帮助其他希望做类似事情的人。

我又更新了一次概念验证项目现在,一旦满足了所有异步依赖关系,新的单个复合依赖关系就是一个实际的@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,当我需要获取会话信息时,它看起来像这样:

    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人所期望的那样获得和带注释的字段的依赖关系。这样,我实际上可以拥有@Injectafter @Produce

不像我想要的那样干净,但是仍然比没有DI更好。现在,可以按任何顺序满足在任意时间范围内运行的任意数量的异步依赖项,并且一旦它们全部就绪,就可以Future设置一个SessionProvisionComponent,并准备将这些@Produced依赖项注入依赖项。

多高兴。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在commit()之后调用onCreate()吗?

来自分类Dev

在registerUserNotificationSettings之后立即调用registerForRemoteNotifications吗?

来自分类Dev

finish()之后可以恢复Android活动吗?

来自分类Dev

我可以在之后嵌套伪元素吗?

来自分类Dev

我可以在dismiss()之后显示()FragmentDialog吗?

来自分类Dev

我的js for循环在0之后停止吗?

来自分类Dev

jQuery的:之后选择器可能吗?

来自分类Dev

fread之后不能直接使用fwrite吗?

来自分类Dev

播放框架:在onStart之后存储连接吗?

来自分类Dev

在cellForItemAtIndexPath之后调用了viewWillAppear吗?

来自分类Dev

可以在make之后更改前缀吗?

来自分类Dev

在tcsh中的cd之后是ls吗?

来自分类Dev

Ninite之后可以使用Chocolatey吗?

来自分类Dev

JavaScript 在 yield 语句之后执行代码吗?

来自分类Dev

C ++将类定义放在main()函数之后吗?

来自分类Dev

在调用quit合法且明智之后重启QThread吗?

来自分类Dev

attach()方法之后会调用detach()方法吗?

来自分类Dev

在printf之后使用fflush会降低程序速度吗?

来自分类Dev

在executeBatch()之后需要一个connection.commit()吗?

来自分类Dev

在介绍开始之后,IntroJS可以“刷新”突出显示的元素吗?

来自分类Dev

我可以使用git clone之后存在的文件吗?

来自分类Dev

在启动angular.bootstrap之后要取消引导吗?

来自分类Dev

指针可以指向4GB之后的地址吗?

来自分类Dev

ReactJS-我可以在renderComponent之后立即调用setState吗?

来自分类Dev

无论如何,在onReceivedError之后调用了onPageFinished吗?

来自分类Dev

我可以在popViewcontroller之后调用委托方法吗?

来自分类Dev

升级SDK之后,代码会更改行为吗?

来自分类Dev

可以在嵌入IPython之后指定要运行的命令吗?

来自分类Dev

在popViewControllerAnimated之后,UINavigationController不会释放/销毁控制器吗?

Related 相关文章

  1. 1

    在commit()之后调用onCreate()吗?

  2. 2

    在registerUserNotificationSettings之后立即调用registerForRemoteNotifications吗?

  3. 3

    finish()之后可以恢复Android活动吗?

  4. 4

    我可以在之后嵌套伪元素吗?

  5. 5

    我可以在dismiss()之后显示()FragmentDialog吗?

  6. 6

    我的js for循环在0之后停止吗?

  7. 7

    jQuery的:之后选择器可能吗?

  8. 8

    fread之后不能直接使用fwrite吗?

  9. 9

    播放框架:在onStart之后存储连接吗?

  10. 10

    在cellForItemAtIndexPath之后调用了viewWillAppear吗?

  11. 11

    可以在make之后更改前缀吗?

  12. 12

    在tcsh中的cd之后是ls吗?

  13. 13

    Ninite之后可以使用Chocolatey吗?

  14. 14

    JavaScript 在 yield 语句之后执行代码吗?

  15. 15

    C ++将类定义放在main()函数之后吗?

  16. 16

    在调用quit合法且明智之后重启QThread吗?

  17. 17

    attach()方法之后会调用detach()方法吗?

  18. 18

    在printf之后使用fflush会降低程序速度吗?

  19. 19

    在executeBatch()之后需要一个connection.commit()吗?

  20. 20

    在介绍开始之后,IntroJS可以“刷新”突出显示的元素吗?

  21. 21

    我可以使用git clone之后存在的文件吗?

  22. 22

    在启动angular.bootstrap之后要取消引导吗?

  23. 23

    指针可以指向4GB之后的地址吗?

  24. 24

    ReactJS-我可以在renderComponent之后立即调用setState吗?

  25. 25

    无论如何,在onReceivedError之后调用了onPageFinished吗?

  26. 26

    我可以在popViewcontroller之后调用委托方法吗?

  27. 27

    升级SDK之后,代码会更改行为吗?

  28. 28

    可以在嵌入IPython之后指定要运行的命令吗?

  29. 29

    在popViewControllerAnimated之后,UINavigationController不会释放/销毁控制器吗?

热门标签

归档