我正在将项目转换为匕首。 项目包括: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);
}
}
任何提示?感谢
答案 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