2016-04-24 16 views
1

私はApiServiceのクラス(User)に依存しています。私はすでにコンポーネントクラスにprovideUserを持っています。私は2つのフィールドに同じprovideUser私のユーザークラスを注入しようとしています。問題は、一つのフィールドがクラスであり、第二は、このようなインターフェイスであることである。ダガー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

これを行う最も簡単な方法は、引数としてUserを取り、UserFullとしてそれを返します。これは、あなたの@Moduleに別の方法を作ることになります

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

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

User引数はprovideUser()方法によって成就されます。

Daggerは、UserFullの実装がどのようなものかを推測する方法はありません。このため、これを指定して2番目のメソッドを追加する必要があります。

+1

ええ、それも私の解決ですが、私はもっと優雅なものを見つけることをもっと望んでいます。今私はインプリメンテーションをインジェクトするときに明確にするのは難しいと思っています。しかし、まだ、私はより多くのアイデア(もしあれば)を開いたままにしておきます、そして、私は受け入れられた答えをマークします。マルチザム。 – shadox