使用Dagger,可以重新创建一个注入的对象吗?

时间:2017-06-06 17:35:40

标签: android dagger

A代码与此类似:

class MyActivity extends Activity {
    IStrategy mStrategy;

    public void onCreate(Bundle data) {
        if (someSpecificCondition) {
            mStrategy = new StrategyA();
        } else {
            mStrategy = new StrategyB();
        }
    }

    public void onUnsupportedState() {
        // Will have to switch strategy
        mStrategy = new StrategyB();
    }
}

我想在这里注入IStrategy。但我有两个问题:

  1. 它是一个接口,具体实现动态变化。
  2. 即使选择了具体的实施,也有可能需要重新创建。
  3. 我可以通过创建一个带有决策逻辑的提供方法来克服(1)(不确定它是否是最好的方法)。

    但我不知道如何处理(2)。 在这种情况下手动创建注入对象是否可以?有没有人看到另一种解决方案?

1 个答案:

答案 0 :(得分:1)

正如您所说,向提供者方法添加逻辑不是一个好的设计决策。在某些情况下,手动实例化对象是有效的,但仅作为最后的手段。

在这种情况下,最好的方法(IMHO)是注入抽象工厂,按需实例化IStrategy实现。

在当前状态下,工厂方法需要接受额外的参数,允许您指定您感兴趣的策略。虽然它不是世界末日,但客户端控制哪个它使用的策略有点不干净 - 客户知道有多少策略。

根据具体的用例,您可能能够重构代码并提取区分客户端策略的逻辑。这样,您的客户端将要求IStrategy,同时完全不知道实现的具体细节和可用实现的数量。