Dagger 2 - 将类注入声明的接口

时间:2016-04-24 19:42:33

标签: java android dependency-injection dagger-2

我在ApiService中依赖于一个类(User)。我的Component类中已经有provideUser。我尝试将相同的provideUser我的User类注入2个字段。问题是一个字段是一个类,第二个字段是这样的接口:

@Inject
User user;

@Inject
UserFull userFull;

和组件代码:

package com.ltx.dagger2.components;
import com.ltx.dagger2.activities.MainActivity;
import com.ltx.dagger2.modules.BackendServiceModule;
import com.ltx.dagger2.modules.UserModule;
import javax.inject.Singleton;
import dagger.Component;


@Singleton
@Component(modules = {UserModule.class, ... other stuff})
public interface AppComponent {
    void inject(MainActivity activity);
}

等式中的其他元素:

public class User implements UserFull {
    String firstName;
    String lastName;

    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return "User{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                '}';
    }

    @Override
    public String getFullName() {
        return firstName + " " + lastName;
    }
}

public interface UserFull {

    String getFullName();
}

和模块代码:

package com.ltx.dagger2.modules;import com.ltx.dagger2.models.User; import com.ltx.dagger2.models.UserFull; import javax.inject.Singleton;import dagger.Module; import dagger.Provides;

@Module
public class UserModule {

    @Singleton
    @Provides
    User provideUser() {
        return new User("Hakuna","Matata");
    }
}

我可以强制Dagger2为UserFull字段提供相同的User类,还是总是要添加特定的UserFull provideUserFull方法?

1 个答案:

答案 0 :(得分:1)

最简单的方法是在@Module中制作另一种方法,将User作为参数并将其作为UserFull返回:

@Module
public class UserModule {
    @Singleton
    @Provides
    User provideUser() {
        return new User("Hakuna","Matata");
    }

    @Provides
    UserFull provideUserFull(User user) {
        return user;
    }
}

User参数将由provideUser()方法完成。

Dagger无法自己猜测它必须提供哪种UserFull实现。这就是你必须指定它并添加第二种方法的原因。