根据用于共享代码的gradle库模块,如何使用匕首?

时间:2017-11-21 05:14:09

标签: java android dagger-2 dagger

我正在将项目转换为匕首。 项目包括:app gradle模块和:library gradle模块。库在某种意义上不是真正的库,而是一种在app的变体之间共享代码公共代码的方法。

所以基本上它提供了例如BaseFooFragment扩展:app模块通过FooFragment扩展。更具体的例子是BaseRestManager,它在整个库中使用。应用程序应将其扩展到RestManager。它也应该是一个单身人士。

如果没有dagger,我通常会在BaseApp应用程序类中使用:库模块提供BaseRestManager并使用内部库。在app模块中,我将BaseApp子类化为App并覆盖BaseRestManager,提供RestClient并将返回类型从BaseRestManager getRestManager缩小到RestManager getRestManager,因此消费App代码也不必强制转换它。

Btw库模块永远是模块,它不需要它自己工作。它只是一种共享代码的方式。 DRY。

我如何用匕首做到这一点?如果我有一个@Provides方法返回BaseRestManager,第二个@Provides返回RestManager都注释了@Singleton,它显然创建了2个不是我想要的实例。它应该只是一个,RestManager的实例。

public abstract class BaseApp extends Application {
    public abstract BaseRestManager getRestManager();
}

public class App extends BaseApp {

    private RestManager mRestManager;

    @Override
    public void onCreate() {
        super.onCreate();
        mRestManager = new RestManager(...);
    }

    @Override public RestManager getRestManager() {
        return mRestManager;
    }
}

public class BaseFooFragment extends Fragment {

    @Override public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("Default", "BaseFooFragment # baseRestManager=" + ((BaseApp) getActivity().getApplication()).getRestManager());
    }
}

public class FooFragment extends BaseFooFragment {

    @Override public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("Default", "FooFragment # restManager=" + ((App) getActivity().getApplication()).getRestManager());
    }
}

日志语句应该打印相同的RestManager实例。在匕首id中,代码可能看起来像这样

public class BaseFooFragment extends Fragment {

    @Inject BaseRestManager mBaseRestManager;

    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ((BaseApp) getActivity().getApplication()).getComponent().inject(this);
    }
}

public class FooFragment extends Fragment {

    @Inject RestManager mRestManager;

    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ((App) getActivity().getApplication()).getComponent().inject(this);
    }
}

任何提示?感谢

1 个答案:

答案 0 :(得分:1)

您可以在Dagger中提供许多接口的子类。 像这样:

FirebaseDataRepository 实施 DataRepository

@Singleton
@Provides
@Named(Scope.FIREBASE)
public DataRepository provideFirebaseData(FirebaseDataRepository repo) {
    return repo;
}

您还可以提供另一个 AnyDataReposity 实现 DataRepository

P / s:注射时,您必须指定要使用的那个:

@Named(Scope.FIREBASE) DataRepository dataRepo