web-dev-qa-db-ja.com

短剣注入は静的な方法で行うことができますか?

私はこのネットワークモジュールを持っています。 ErrorUtilsの静的メソッドにネットワークモジュールを挿入したい。

@Module
public class NetworkModule {
    private final String END_POINT = "https://www.myurl.com/";

    @Provides
    @Singleton
    public OkHttpClient getOkHttpClient() {
            OkHttpClient okHttpClient = builder.build();
            return okHttpClient;
       }

    @Provides
    @Singleton
    public GsonConverterFactory getGsonConverterFactory() {
        return GsonConverterFactory.create();
    }

    @Provides
    @Singleton
    public Retrofit getRetrofit(OkHttpClient okHttpClient, GsonConverterFactory gsonConverterFactory) {
        return new Retrofit.Builder()
                .baseUrl(END_POINT)
                .client(okHttpClient)
                .addConverterFactory(gsonConverterFactory)
                .build();
    }

    @Provides
    @Singleton
    public RetrofitService getRetrofitService(Retrofit retrofit) {
        return retrofit.create(RetrofitService.class);
    }

そして、私はこのモジュールを静的メソッドに注入したい:

public class ErrorUtils {
    @Inject
    static Retrofit retrofit;

    public static RestError parseError(Response<?> response) {

        **//showing error while writing this line**

        MyApplication.getComponent().inject(ErrorUtils.class);
        Converter<ResponseBody, RestError> converter = retrofit.responseBodyConverter(RestError.class, new Annotation[0]);

        RestError error;

        try {
            error = converter.convert(response.errorBody());
        } catch (IOException e) {
            return new RestError();
        }

        return error;
    }
}

どのようにして静的メソッドにモジュールを注入できますか?

16
Rajesh Khadka

Dagger 1 からの移行でわかるように

ダガー2は、スタティックインジェクションをサポートしていません

静的なメソッドと変数は、一般的に悪い考えです。あなたの場合、ErrorUtilsをオブジェクトにすることができます。 @Singletonスコープ。次に、静的呼び出しを使用せずに、サービスを適切に注入し、errorUtilsを適切に注入することができます。

それが選択肢でない場合は、コンポーネントにゲッターを提供するだけです

@Component interface MyComponent {
    Retrofit getRetrofit();
}

次に、そのメソッドを使用して静的変数を設定します。

24
David Medenjak