我在Android应用程序中启动了针对依赖注入的dagger2评估,并对我当前的架构有一些疑问。
我的项目中有几个模块:
app1/
app2/
libA/
此设置允许我在多个应用程序之间共享通用部分(包括一些活动)。
使用dagger2在应用程序模块中注入依赖项是可以的,我在我的应用程序中使用其模块构建组件,并从我的Activity中检索Application中的组件以注入依赖项。
app1/MyApplication.java
public MyApplication extends Application
{
private MyComponent mMyComponent;
@Override
public void onCreate()
{
// bind & inject dependencies
mMyComponent = DaggerMyComponent.builder()
.myModule(new MyModule(this))
.build();
}
MyComponent getMyComponent()
{
return mMyComponent;
}
}
app1/MyActivity.java
public MyActivity extends Activity
{
@Inject
MyDependency mDependency;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
final MyComponent myComponent = ((MyApplication) getApplication()).getMyComponent();
myComponent.inject(this);
}
}
困扰我的是MyActivity
和MyApplication
或MyComponent
之间的紧密联系以处理注射。
如果我在MyActivity2
中定义了另一项活动libA/
,我就会陷入困境,无法注入依赖关系。
我不知道该怎么办。 我在这里看到了一个类似的问题:Multi-layer / libraries architecture with dagger2: designing scopes, components, modules并且答案是指具有这种设置的示例应用程序项目,除了库模块没有在Activity中注入依赖项。
我做了一个丑陋的解决方法继续前进,但它真的不满意:
我添加了Injector
界面:
public interface Injector
{
void inject(Object target);
}
然后MyApplication
实现了Injector
,允许我写出类似的内容:
libA/MyActivity2
public MyActivity2 extends Activity
{
@Inject
MyDependency mDependency;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
((Injector) getApplication()).inject(this);
}
}
它削减了MyApplication
和MyComponent
的依赖关系。
然后,丑陋的部分是inject实现,它针对所有支持的类测试对象(使用instanceof
)并调用正确的inject(MyActivity2)
方法。
@Component(modules={MyModule.class})
@Singleton
public abstract class MyComponent
{
public void inject(Object target)
{
// FIXME the ugly part
if (target instanceof MyApplication)
inject((MyApplication) target);
else if (target instanceof MyActivity)
inject((MyActivity) target);
else if (target instanceof MyActivity2)
inject((MyActivity2) target);
}
public abstract void inject(MyApplication target);
public abstract void inject(MyActivity target);
public abstract void inject(MyActivity2 target);
}