使用 Dagger,可以重新创建注入的对象吗?
Using Dagger, is it ok to recreate an injected object?
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。但是我有两个问题:
- 是接口,具体实现是动态变化的。
- 即使选择了具体的实施方式,也有可能需要重新创建。
我可以通过创建一个带有决策逻辑的 provides 方法来克服 (1)(尽管不确定这是否是最佳方法)。
但我不确定如何处理 (2)。
在这种情况下手动创建注入对象是否可以?有人看到其他解决方案吗?
正如您所说,向提供程序方法添加逻辑并不是一个好的设计决策。手动实例化对象在某些情况下是有效的,但只能作为最后的手段。
在这种情况下,最好的方法(恕我直言)是注入抽象工厂,根据需要实例化 IStrategy
实现。
在目前的情况下,工厂方法将需要接受额外的参数,允许您指定您感兴趣的策略。虽然这不是世界末日,但客户端的事实控制它使用的策略有点不干净——客户端知道有多少策略。
根据手头的具体用例,您或许能够重构代码并从客户端中提取区分策略的逻辑。这样,您的客户将要求 IStrategy
,同时完全不知道实现的细节和可用实现的数量。
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。但是我有两个问题:
- 是接口,具体实现是动态变化的。
- 即使选择了具体的实施方式,也有可能需要重新创建。
我可以通过创建一个带有决策逻辑的 provides 方法来克服 (1)(尽管不确定这是否是最佳方法)。
但我不确定如何处理 (2)。 在这种情况下手动创建注入对象是否可以?有人看到其他解决方案吗?
正如您所说,向提供程序方法添加逻辑并不是一个好的设计决策。手动实例化对象在某些情况下是有效的,但只能作为最后的手段。
在这种情况下,最好的方法(恕我直言)是注入抽象工厂,根据需要实例化 IStrategy
实现。
在目前的情况下,工厂方法将需要接受额外的参数,允许您指定您感兴趣的策略。虽然这不是世界末日,但客户端的事实控制它使用的策略有点不干净——客户端知道有多少策略。
根据手头的具体用例,您或许能够重构代码并从客户端中提取区分策略的逻辑。这样,您的客户将要求 IStrategy
,同时完全不知道实现的细节和可用实现的数量。