Как решить проблему внедрения циклических зависимостей dagger-2 внутри класса модели, который имеет ссылку на себя? - PullRequest
0 голосов
/ 18 апреля 2019

Я использую Dagger 2 в своем проекте, он работает хорошо, но теперь я изменил одну из моделей для ссылки на себя (имея родительское поле того же типа), и после этого мы не можем скомпилировать проект, и он сообщает

> error: [ComponentProcessor:MiscError] dagger.internal.codegen.ComponentProcessor was unable to process this interface because not all of its dependencies could be resolved. Check for compilation errors or a circular dependency with generated code.
public interface AppComponent {

Я использую проект github для имитации примера

Проблема может быть воспроизведена с использованием проекта ниже https://github.com/kioko/android-liveData-viewModel/issues/4

Все, что я сделал, это добавил собственную ссылку на модель.

Я понимаю, что кинжал-2 не допустит циклического внедрения, но здесь он является классом модели и не вводится напрямую где-либо, скорее это просто указывается в классе обслуживания, который его вводит.

Я не уверен, упускаю ли я что-либо, что может быть глупым, но это отняло у меня много времени, и я все еще на том же месте, где это началось, и не могу добиться какого-либо прогресса.

Любые быстрые указатели должны быть очень полезны.

        primaryKeys = {"id"})
@TypeConverters(TmdbTypeConverters.class)
public class Movie {
    @SerializedName("id")
    @Expose
    @NonNull
    public final int id;
    @SerializedName(value = "poster_path")
    public String posterUrl;
    public Double rating;
    @SerializedName(value = "release_date")
    public String releaseYear;
    public String title;
    public Boolean adult;
    public String overview;
    @SerializedName(value = "original_title")
    public String originalTitle;
    @SerializedName(value = "original_language")
    public String originalLanguage;
    @SerializedName(value = "backdrop_path")
    public String backdropPath;
    public Double popularity;
    @SerializedName(value = "vote_count")
    public Integer voteCount;
    public Boolean video;
    @SerializedName(value = "vote_average")
    public Double voteAverage;
    @SerializedName(value = "genre_ids")
    public List<Integer> genreIds;

    @SerializedName(value = "parent")
    public Movie parent;

    public Movie(int id, String posterUrl, Double rating, String releaseYear, String title, Boolean adult,
                 String overview, String originalTitle, String originalLanguage, String backdropPath,
                 Double popularity, Integer voteCount, Boolean video, Double voteAverage, List<Integer> genreIds, Movie parent) {
        this.id = id;
        this.posterUrl = posterUrl;
        this.rating = rating;
        this.releaseYear = releaseYear;
        this.title = title;
        this.adult = adult;
        this.overview = overview;
        this.originalLanguage = originalLanguage;
        this.originalTitle = originalTitle;
        this.backdropPath = backdropPath;
        this.popularity = popularity;
        this.voteCount = voteCount;
        this.video = video;
        this.voteAverage = voteAverage;
        this.genreIds = genreIds;
        this.parent = parent;
    }
}
public interface TmdbService {

    @GET("movie/top_rated?")
    LiveData<ApiResponse<MovieResult>> getTopRatedMovies();

    @GET("movie/popular?")
    LiveData<ApiResponse<MovieResult>> getPopularMovies();

    @GET("movie/latest")
    LiveData<ApiResponse<MovieResult>> getLatestMovies();

    @GET("discover/movie?sort_by=popularity.desc")
    LiveData<ApiResponse<MovieResult>> discoverPopularMovies();

    @GET("search/movie?")
    LiveData<ApiResponse<MovieResult>> searchMovies(@Query("query") String query);

    @GET("movie/{movie_id}")
    LiveData<ApiResponse<Movie>> getMovieById(@Path("movie_id") int movieId);

    @GET("movie/{movie_id}/similar")
    LiveData<ApiResponse<Movie>> getSimilarMovies(@Path("movie_id") int movieId);

    @GET("genre/movie/list")
    LiveData<ApiResponse<GenreResponse>> getGenres();

    @GET("movie/{movie_id}/videos")
    LiveData<ApiResponse<VideoResult>> getMovieVideos(@Path("movie_id") int movieId);
}
...