【问题标题】:Dagger 2: injecting singleton with lots of access pointsDagger 2:注入具有大量接入点的单例
【发布时间】:2015-11-05 12:45:40
【问题描述】:

我刚开始使用 DI / Dagger 2。我有一个庞大的项目。为了尝试 dagger 2,我开始注入我的单例类“MyPreferences”。此类处理来自和去往 SharedPreferences 的所有应用操作。

在 MyPreferences 中自动注入 SharedPreferences 非常完美。

但是,我在大约 50 个课程中使用这个单例,我曾经这样做:

 MyPreferences.getInstance(context).getXXXSetting();

我已经在几个类中将其更改为 dagger2 注入,它工作正常,但我发现自己一直在复制这些行:

@Inject
protected MyPreferences myPreferences;

protected void initInjection(Context context) {
    ((RootApplicationDi) context.getApplicationContext()).getComponent().injectTo(this);
}

// + call initInjection @ onCreate / constructor

对于这样一个简单的调用,我需要大约 35-40 个(超级)类中的所有这些行。我错过了什么吗?这真的是要走的路吗?

【问题讨论】:

  • 你有一个运行良好的大型项目......只有一个单例。为什么要改变它?您希望通过切换到 DI 获得什么? (附:反对票不是我的)

标签: android dependency-injection dagger dagger-2


【解决方案1】:

我之前的回答是针对 Dagger 1 的,因此不正确。这是 Dagger 2 的示例解决方案:

在您的应用程序类中:

private MyDagger2Component mDependencyInjector;


@Override
public void onCreate() {
    super.onCreate();

    mDependencyInjector = DaggerMyDagger2Component.builder()...build();
}


public MyDagger2Component getDependencyInjector() {
    return mDependencyInjector;
}

在您的活动扩展的基础Activity 类中:

protected MyDaggerComponent getDependencyInjector() {
    return ((MyApplication) getApplication()).getDependencyInjector();
}

在您的活动中,您现在可以只有一行用于注入:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getDependencyInjector().inject(this);
    ...
}

【讨论】:

    猜你喜欢
    • 2022-09-30
    • 1970-01-01
    • 2018-06-13
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多