Как да инжектираме списък или набор в Dagger, както можем да го направим през пролетта?

Всичко е във въпроса. Например, за клас Foo, съдържащ списък от String:

public class Foo {

 private List<String> fooList;

 //getter and setter

}

в Xml можем да направим следното:

<bean id="foo" class="Foo">
  <property name="fooList">
     <list>
        <value>bar</value>
        <value>baz</value>           
    </list>
</property>


person Dimitri    schedule 01.09.2014    source източник
comment
Изглежда, че трябва да създадете доставчик за това, вижте отговора на подобен въпрос stackoverflow.com/a/18105271/2807168   -  person leveluptor    schedule 01.09.2014


Отговори (1)


Използвайки Dagger, ще трябва да превърнете вашия fooList в зависимост от вашия Foo клас. Бихте направили това, като го анотирате с @Inject. Това ще каже на Dagger, че когато Foo бъде създадено от Dagger, това също List<String> fooList трябва да бъде инжектирано. Имайте предвид, че fooList не е лично в моя пример. Тъй като Dagger не използва рефлексия и вместо това използва генериране на код, трябва да декларирате полета за инжектиране като публичен или частен обхват.

public class Foo {

    @Inject
    @Named("FooDependency")
    List<String> footList;

    // getter and setter

}

Тук, тъй като List е често срещан тип, ние го отбелязваме с @Named("FooDependency"), където "FooDependency" може да бъде всеки низ, който желаете. Правим това, защото е възможно да искате да инжектирате друг List<String> другаде в приложението и бихме искали да можем да правим разлика между 2-те. Другият List<String> може да бъде анотиран с @Named("ADifferentDependency") например.

След това ще трябва да анотирате метод с @Provide в един от вашите модули, който ще се погрижи за предоставянето на тази зависимост.

@Module(injects = Foo.class)
public class SomeModule {
    @Provide
    @Named("FooDependency")
    public List<String> provideFooDependencyListOfString() {
        return Arrays.asList("1", "2", "3");
    }
}

След това можете да го използвате

ObjectGraph objectGraph = ObjectGraph.create(new SomeModule());
Foo foo = objectGraph.get(Foo.class);
person Miguel    schedule 02.09.2014