Использование Dagger для внедрения зависимостей в конструкторы

Так что я'м в настоящее время редизайн моего приложения Android для использованияКинжал, Мое приложение большое и сложное, и недавно я столкнулся со следующим сценарием:

Объект A требует специального экземпляра DebugLogger, который является идеальным кандидатом для внедрения. Вместо того, чтобы обойти регистратор, я могу просто ввести его через A 'конструктор Это выглядит примерно так:

class A
{
    private DebugLogger logger;

    @Inject
    public A(DebugLogger logger)
    {
        this.logger = logger;
    }

    // Additional methods of A follow, etc.
}

Пока это имеет смысл. Однако, A должен быть построен другим классом B. Несколько экземпляров A должны быть созданы, поэтому следуя Dagger 'S способ делать вещи, я просто вводитьProvider<a></a> в Б:

class B
{
    private Provider<a> aFactory;

    @Inject
    public B(Provider</a><a> aFactory)
    {
        this.aFactory = aFactory;
    }
}
</a>

Хорошо, пока хорошо. Но подождите, внезапно А потребуются дополнительные входные данные, такие как целое число с именем "количество" это жизненно важно для его строительства. Теперь мой конструктор для A должен выглядеть так:

@Inject
public A(DebugLogger logger, int amount)
{
...
}

Внезапно этот новый параметр мешает инъекции. Более того, даже если бы это сработало, я не смог бы пройти мимо »количество" при получении нового экземпляра от провайдера, если я не ошибаюсь. Там'Несколько вещей, которые я мог бы сделать здесь, и мой вопрос, какой из них лучший?

Я мог бы рефакторинг А, добавивsetAmount() метод, который, как ожидается, будет вызван после конструктора. Это уродливо, однако, потому что это заставляет меня отложить строительство А до "количество" был заполнен. Если бы у меня было два таких параметра "количество" а также "частота», тогда у меня было бы два сеттера, что означало бы либо сложную проверку, гарантирующую возобновление построения A после вызова обоих сеттеров, либо мне пришлось бы добавить еще один третий метод в микс, например, так:

(Somewhere in B):

A inst = aFactory.get();
inst.setAmount(5);
inst.setFrequency(7);
inst.doConstructionThatRequiresAmountAndFrequency();

Другой альтернативой является то, что я не• использовать инжекцию на основе конструктора и использовать инъекцию на основе поля. Но теперь я должен обнародовать свои поля. Это немне это не нравится, потому что теперь я обязан раскрывать внутренние данные своих занятий другим классам.

Пока что единственное элегантное решение, о котором я могу подумать, - это использовать инъекцию на основе поля для поставщиков, например:

class A
{
    @Inject
    public Provider loggerProvider;
    private DebugLogger logger;

    public A(int amount, int frequency)
    {
        logger = loggerProvider.get();
        // Do fancy things with amount and frequency here
        ...
    }
}

Даже до сих пор яя не уверен насчет сроков, так как яЯ не уверен, что Dagger внедрит провайдера перед вызовом моего конструктора.

Есть ли способ лучше? Я что-то упускаю из-за того, как работает Dagger?

Ответы на вопрос(4)

Ваш ответ на вопрос