gpt4 book ai didi

Dagger 2 - 从多个独立作用域的组件注入(inject)到单个对象

转载 作者:行者123 更新时间:2023-12-02 03:14:36 25 4
gpt4 key购买 nike

我面临的问题是我想要两个独立的范围,它们并不真正属于父子层次结构。就我而言,我想要两种类型的范围:

1) 基于“特征”的范围。例如,当用户输入功能时,将创建一个作用域组件。当用户离开该功能时,该范围将被销毁。

2) 基于“Activity”的范围(这是针对 Android 应用的,如果您不使用 Android,请原谅这个术语)。创建事件时,会创建一个作用域组件。当事件被销毁时,该范围也被销毁。

子组件和组件依赖项都无法满足我的需求。这是因为该功能可能会在事件被销毁之前结束。同样,事件可以在功能完成之前结束。

我知道我可以只使用提供方法而不是成员注入(inject)方法并持有两个独立的组件,但我希望能够简单地 inject 我所有的依赖项在一个单一的目的。还有其他人对此有任何想法吗?

最佳答案

这是我能想到的最好的解决方案。我对将我的 Activity 相关对象耦合到我的应用程序中的其他状态有同样的感觉,并实现了类似这样的东西。

假设您有三个范围:应用程序范围、事件范围和一些功能范围(例如,具有个人资料信息等的用户登录状态)。 Activity 和 Feature 范围是 Application 范围的子级,但 Feature 和 Activity 是不相关的 sibling 。

不要直接将Featured范围对象直接注入(inject)到Activity中。相反,将包含 getter 的桥注入(inject)到功能范围的一侧。

例子:

public interface UserManager {
@Nullable
User getLoggedInUser();

@Nullable
ShoppingCart getShoppingCart();
}

这些方法可以为空,因为当其他对象尝试访问它们时,用户可能已登录,也可能未登录。如果它们为空,则用户未登录;该功能未激活。

这个实现自由地从功能范围端执行依赖注入(inject),因为它不引用事件范围的任何内容。

public class UserManagerImpl implements UserManager {
@Inject
ShoppingCart cart;

@Inject
User user;

public UserManagerImpl(MyApplication application){
UserScopeComponent component = application.getUserComponent();
if(component != null) {
//only attempt injection if the component exists (user is logged in)
component.inject(this);
}
}

//put simple getters here. They will return null objects if the component didnt inject anything.
}

ApplicationModule 提供了这个对象。它不是应用程序范围或单例;你想在每次注入(inject)时再次初始化它,以防登录状态发生变化。

@Provides
//No Scope
UserManager provideUserManager(){
return new UserManagerImpl(context);
}

从那时起,您可以从应用中的任何位置注入(inject) UserManager,调用它的 getter,检查输出是否不为 null,然后就可以了。您的 Feature 状态不再与 Activity 状态耦合,您可以自由了。

关于Dagger 2 - 从多个独立作用域的组件注入(inject)到单个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37830392/

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