2016-04-24 4 views
1

У меня есть зависимость от класса (пользователя) в моем ApiService. У меня уже есть provideUser в моем классе Component. Я пытаюсь ввести с тем же свойством serviceUser мой пользовательский класс в 2 поля. Проблема состоит в том, что одно поле является классом, а второй представляет собой интерфейс, как это:Dagger 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 предоставить один и тот же класс User в поле UserFull или мне всегда нужно добавить определенный метод UserFull provideUserFull?

ответ

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() методом.

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

+1

Да, это тоже мое решение, но я как бы надеялся найти что-то более элегантное. Теперь, когда я думаю, что, вероятно, трудно быть однозначным при инъекционном внедрении. Но, тем не менее, я буду держать вопрос открытым для большего количества идей (если таковые имеются), тогда я отмечу принятый ответ. Multzam. – shadox

Смежные вопросы