图书馆使用匕首注射活动

时间:2017-07-05 22:40:19

标签: java android dependency-injection architecture dagger-2

我在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);
  }
}

困扰我的是MyActivityMyApplicationMyComponent之间的紧密联系以处理注射。 如果我在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);
  }
}

它削减了MyApplicationMyComponent的依赖关系。 然后,丑陋的部分是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);

}

0 个答案:

没有答案