考虑到模块都是通过 Dagger1 规范相互共享的,您可以通过构造函数参数complete=false, library=true
接收方法提供的元素,如下所示。@Provides
public class GetUserForUsernameTaskImpl
implements GetUserForUsernameTask {
public static final String TAG = GetUserForUsernameTaskImpl.class.getSimpleName();
private Realm realm;
private UserRepository userRepository;
public GetUserForUsernameTaskImpl(Realm realm, UserRepository userRepository) {
this.realm = realm;
this.userRepository = userRepository;
}
@Override
public RealmResults<UserRLM> getUsers() {
try {
RealmResults<UserRLM> users = userRepository.findAll(realm);
...
}
@Module(includes = {RepositoryModule.class, RealmModule.class})
public class DatabaseTaskModule {
@Provides
public GetUsersDatabaseTask getUsersDatabaseTask(Realm realm, UserRepository userRepository) {
return new GetUsersDatabaseTaskImpl(realm, userRepository);
}
}
但是,您也可以仅指定一个包含组件图的依赖项(thePresenter
或CustomApplication
实例),并使用该组件图来注入您的实现类。
public class GetUserForUsernameTaskImpl
implements GetUserForUsernameTask {
public static final String TAG = GetUserForUsernameTaskImpl.class.getSimpleName();
@Inject
public Realm realm;
@Inject
public UserRepository userRepository;
protected Presenter presenter;
private boolean isInjected = false;
public GetUserForUsernameTaskImpl(Presenter presenter) {
this.presenter = presenter;
}
@Override
public RealmResults<UserRLM> getUsers() {
if(!isInjected) {
presenter.getPresenterComponent().inject(this);
isInjected = true;
}
try {
RealmResults<UserRLM> users = userRepository.findAll(realm);
...
}
}
@Module(includes = {PresenterModule.class})
public class DatabaseTaskModule {
@Provides
public GetUsersDatabaseTask getUsersDatabaseTask(Presenter presenter) {
return new GetUsersDatabaseTaskImpl(presenter);
}
}
这样,您只需要依赖演示者的对象图,而不必弄乱构造函数参数。
哪个是更好的方法?
编辑:我在一个不太好的重构项目中的一个更清晰和具体的例子如下:
@Module(includes = {ContextModule.class})
public class ClientAuthModule {
@Provides
public ClientAuthAuthenticator clientAuthAuthenticator(CustomApplication customApplication) {
return new ClientAuthAuthenticator(customApplication);
}
}
然后
public class CustomApplication
extends Application {
public static class InjectorInitializedEvent {
}
public static class InjectorInitializedEventProducer {
@Produce
public InjectorInitializedEvent produceEvent() {
return new InjectorInitializedEvent();
}
}
private ApplicationComponent applicationComponent;
@Override
public void onCreate() {
super.onCreate();
applicationComponent = Injector.INSTANCE.initializeApplicationComponent();
SingletonBus.INSTANCE.getBus().post(new InjectorInitializedEvent());
SingletonBus.INSTANCE.getBus().register(new InjectorInitializedEventProducer()); //OTTO bus, event producer
}
public ApplicationComponent getApplicationComponent() {
return this.applicationComponent;
}
}
然后
public class ClientAuthAuthenticator {
private CustomApplication customApplication;
@Inject
public PEMConverter pemConverter;
@Inject
public KeyPairCreator keyPairCreator;
@Inject
public PKCS10CsrCreator pkcs10CsrCreator;
@Inject
public KeyPairReader keyPairReader;
//...
public ClientAuthAuthenticator(CustomApplication customApplication) {
this.customApplication = customApplication;
SingletonBus.INSTANCE.getBus().register(this);
}
@Subscribe
public void onInjectorInitializedEvent(CustomApplication.InjectorInitializedEvent e) {
customApplication.getApplicationComponent().inject(this);
SingletonBus.INSTANCE.getBus().unregister(this);
}
...
问题:这样,当注入器准备好时,所有依赖项都由应用程序的组件提供,而不是通过构造函数提供。但这是一个好方法吗?从长远来看,是否有任何警告?
EDIT2:我在这里有注射器,但它很糟糕。