検索して、あまりにも多くのことを試した後、私は簡単な問題のように思えます。 以下は改造を注入する責任がある私のモジュールです。コンストラクタ・インジェクションとDagger2 2つの異なるクラスからの依存関係を注入する最適な方法
@Module
public class NetworkingModule
{
@Provides
public Retrofit providesRetrofit()
{
Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
return retrofit;
}
}
マイNetworkComponent
@Component(modules = NetworkingModule.class)
public interface NetworkingComponent {
void inject(DashboardPresenterImpl target);
void inject(PicksPresenterImpl picksPresenter);
void inject(LoadsPresenterImpl loadsPresenter);
void inject(ShippingPresenterImpl shippingPresenter);
void inject(GeneralFilePresenterImpl generalFilePresenter);
}
ユーティリティクラス。このクラスにはAppPreferencesも注入されていることに注意してください。
public class AppUtils {
private Context context;
@Inject
AppPreferences preferences;
@Inject
public AppUtils(@ActivityContext Context context)
{
this.context = context;
/*ActivityComponent component = DaggerActivityComponent.builder()
.activityModule(new ActivityModule((Activity) context))
.build();
component.inject(this);*/
}
}
は今、私のコードでは、私はこの
Class MyPresenterImpl{
@Inject
Retrofit retrofit;
@Inject
AppUtils appUtils;
}
示唆してください最適化し、上記目的を達成するための良い方法を達成したいです。
EDIT
追加AppPreference.java
public class AppPreferences {
@Inject
SharedPreferences sharedPreferences;
private SharedPreferences.Editor editor;
@Inject
public AppPreferences(@ActivityContext Context context)
{
ApplicationComponent component = DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule((Application) context.getApplicationContext()))
.build();
component.inject(this);
editor = sharedPreferences.edit();
}
public void putString(String key, String value)
{
editor.putString(key, value).commit();
}
public String getString(String key)
{
return sharedPreferences.getString(key, null);
}
}
簡単な説明で素敵な答えをくれてありがとうが、私の主な質問はまだ答えられていない、つまりクラスMyPresenterImpl { @Inject 改造後の改造; @Inject AppUtils appUtils; } 上記を達成するために、最適化と良い方法を提案してください。「今、私がAppUtilsでコンストラクタインジェクションを使用しているところで、RetrofitがNetworkModuleによって誇張されています。 MyPresenterImplのための別のコンポーネントを作成せずに両方を注入する方法。ありがとう、あなたが共有したブログを読んでいます。 –
'あなたのコンポーネントには、Androidフレームワークタイプ(アクティビティ、フラグメント、...)のみの.inject(..)メソッドが含まれている必要があります。 –
非フレームワーク型は、いくつかのモジュールによって提供されるべきですので、コンストラクタインジェクションのみが必要です(inject()を呼び出す必要はありません) –