Как ввести Инжектор?

Ситуация: мне нужно ленивое инстанцирование зависимости в некоторых FooClass, таким образом, я передаю Injector к классу как параметр конструктора.

private final Injector m_injector;

public FooClass(@Named("FooInjector") Injector injector) {
m_injector = injector;
}

Но облик не разрешает связывать базовые классы (инжекторы, модули и и т.д.). Каково решение?

29
задан Alex M 1 February 2010 в 11:13
поделиться

2 ответа

Да,!! var используется при необходимости 0 | | 1 возвращаемого значения.

Одним из них является простое сравнение значений bool, когда вы хотите, чтобы "a = = b" было эквивалентно "a xor not b", за исключением того, что a = 5 и b = 7 оба будут истинными, но не равными.

Другое дело, когда вы хотите принудительно ввести набор условий в биты переменной:

 var BIT_NONEMPTY=1;
 var BIT_HASERRORS=2;
 var BIT_HASCHILDREN=4;
 var BIT_HASCONTENT=8;

 result_bitfields = 
    (!!countLines())*BIT_NOTEMPTY +
    (!!errorCode())*BIT_HASERRORS +
    (!!firstChild())*BIT_HASCHILDREN +
    (!!getContent())*BIT_HASCONTENT;

Не очень полезно в Javascript, который живет довольно далеко от битовых значений, но может быть полезно иногда.

-121--2088981-

Наиболее простой вариант - предоставление списка в качестве одного из следующих IEnumerable , ICollection ReadOneyCollection через общедоступное свойство.

Таким образом, вы можете создать свой собственный тип списка, в котором Позиции представлены как один из вышеуказанных, но имеется внутренний метод добавления, например,

public class MyList<MyType>
{
    private List<MyType> items;

    public MyList()
    {
        items = new List<MyType>();
    }

    public IEnumerable Items { get { return items.AsEnumerable(); } }
    public Add(MyType item)
    {
        // do internal processing
        items.Add(item);
    }
}
-121--1524248-

Вы не должны использовать инжектор непосредственно Вместо этого передайте в Provider < FooClass > . Кроме того, необходимо ввести провайдера в местах, где используется FooClass .

private final Provider<FooClass> provider;

@Inject
public ClassWhereFooIsUsed(Provider<FooClass> provider) {
    this.provider = provider;
}

.... somewhere else
FooClass f = provider.get(); // This is lazy
27
ответ дан 28 November 2019 в 01:36
поделиться

Измените команду на абсолютную вместо относительной pat. EG:

cmake ~/workspace/project/src && make
-121--1607283-

Некоторые функции Printexc позволяют выполнять это программно.

-121--1486399-

Как сказал @ gpampara, Поставщик < T > должен использоваться для ленивой/необязательной инициализации. Кроме того, как я сказал в своем ответе на ваш другой вопрос, вы должны избегать ссылок на Инжектор в вашем коде почти во всех случаях.

Это означает, что в классе, созданном Guice, Инжектор , который создает объект, может быть введен просто путем объявления зависимости от Инжектора . Инжектор автоматически доступен для инъекции без объявления для него какой-либо привязки.

Если вы вводите инжектор , вам следует подумать о том, ПОЧЕМУ вы хотите это сделать. Почему бы просто не объявить зависимости от фактических интерфейсов/классов, от которых зависит класс? Добавить новую зависимость к конструктору так же просто, как и получить экземпляр некоторой зависимости через Injector в другом месте кода, и это также делает код более понятным.

8
ответ дан 28 November 2019 в 01:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: