当前位置: 首页 > 知识库问答 >
问题:

当使用dagger2进行依赖注入时,我可以只注入超级类吗?

毛淳
2023-03-14

我在android应用程序中使用Dagger2进行DI。我发现我必须为每个使用@inject字段的类编写inject方法。有没有一种方法,我可以只注入父类,这样我就不必对每个子类都调用注入?以活动为例。我有一个baseActivity,每个活动都从它扩展。是否有一种方法可以在组件中为BaseActivity创建一个inject方法,并在BaseActivity的onCreate中调用inject,然后自动注入子活动中的@inject字段?

共有1个答案

幸弘扬
2023-03-14

我也遇到了同样的情况。在所有活动中稍微简化从公共组件注入的一种方法是:

1)扩展应用程序类,使其能够创建公共组件并保留对该组件的引用。

public class ApplicationDagger extends Application {

    private ApplicationComponent component;

    @Override
    public void onCreate(){
        super.onCreate();
        component = DaggerApplicationComponent.builder().applicationModule(new ApplicationModule(this)).build();
    }

    public ApplicationComponent getComponent(){
            return component;
    }
}

2)创建一个抽象的DagnerActivity,它从应用程序中获取公共组件,并调用一个抽象方法injectActivity,将该组件作为参数。如下所示:

public abstract class DaggerActivity extends Activity {

    @Override
    public void onCreate(Bundle saved){
        super.onCreate(saved);
        ApplicationComponent component = ((ApplicationDagger) getApplication()).getComponent();
        injectActivity(component);
    }

    public abstract void injectActivity(ApplicationComponent component);
}
public class FirstActivity extends DaggerActivity {

    @Inject
    ClassToInject object;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //initialize your Activity
    }

    @Override
    public void injectActivity(ApplicationComponent component) {
        component.inject(this);
    }
}

假设您有一个@module类ActivityModule和一个@subcomponent接口ActivityComponent

您需要修改Daggeractivity活动扩展Daggeractivity将需要实现新方法(签名更改)。

public abstract class ActivityDagger extends AppCompatActivity {

    ActivityComponent component;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        component = ((ApplicationDagger) getApplication()).getComponent().plus(new ActivityModule(this));
        injectActivity(component);
        super.onCreate(savedInstanceState);
    }

    ActivityComponent getComponent() {
        return component;
    }

    public abstract void injectActivity(ActivityComponent component);
}

然后,可以像这样创建一个扩展fragment的类fragment:

public abstract class FragmentDagger extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityDagger activityDagger = (ActivityDagger) getActivity();
        ActivityComponent component = activityDagger.getComponent();
        injectFragment(component);
    }

    public abstract void injectFragment(ActivityComponent component);

}
public abstract void injectFragment(ActivityComponent component);
 类似资料:
  • 问题内容: 我在Android应用程序中将Dagger2用于DI。我发现我必须为使用@Inject字段的每个类编写注入方法。有没有一种方法可以只注入父类,而不必在每个子类上调用inject?以活动为例。我有一个“ 每个活动都从中延伸”的内容。有没有一种方法,我可以在BaseActivity的组件中创建一个注入方法,然后在BaseActivity的onCreate中调用inject,子活动中的@in

  • 例如,Foos的资源可能如下所示: 对于酒吧:

  • 从零开始,没有任何以前的Jersey 1.x知识,我很难理解如何在我的Jersey 2.0项目中设置依赖注入。 我也知道HK2在Jersey 2.0中可用,但我似乎找不到有助于Jersey 2.0集成的文档。 我可以让容器启动并提供我的资源,但是当我将@inject添加到MyService时,框架就会抛出一个异常: 我的starter项目可在github:https://github.com/do

  • 本文向大家介绍Dagger2 Android依赖注入学习笔记,包括了Dagger2 Android依赖注入学习笔记的使用技巧和注意事项,需要的朋友参考一下 前言 最近在用 MVP + RxJava + Retrofit 写项目,觉得相对于其他的开发框架,这的确是给我们带来了很多方便,但是在网上搜寻相关资料的时候,总是能看到 MVP + RxJava + Retrofit + Dagger 这样的搭

  • 我尝试在我的活动中注入修改,但我得到了空异常 这是AndroidApplication类

  • 问题在于Azure WebJobs SDK只支持公共静态方法作为作业入口点,这意味着无法实现构造函数/属性注入。 我在官方WebJobs SDK文档/资源中找不到有关此主题的任何内容。我遇到的唯一解决方案是基于本文描述的服务定位器(anti)模式。 对于基于Azure WebJobs SDK的项目,有没有一种好方法可以使用“适当的”依赖项注入?