Я автор фруктов (спасибо Алану за то, что он указал мне на эту тему!). Самый простой способ ввести этот класс в конструкторскую инъекцию. Предполагая, что два интерфейса одинаков (как в вашем примере), и вы хотите 2 различных экземпляров, можно использовать аннотированные инъекции, которая будет выглядеть примерно так:
using namespace fruit;
struct FirstI {};
struct SecondI {};
class A {
IInterface* i1;
IInterface* i2;
public:
INJECT(A(ANNOTATED(FirstI, IInterface*) i1,
ANNOTATED(SecondI, IInterface*) i2))
: i1(i1), i2(i2) {}
};
В вашей get*Component()
функции вы затем должны связать обе (к тому же типу, или различных типов, два полностью независимы, так как они имеют разные аннотаций):
class FirstIImpl : public IInterface {
....
public:
INJECT(FirstIImpl()) = default;
};
class SecondIImpl : public IInterface {
....
public:
INJECT(SecondIImpl()) = default;
};
Component<A> getAComponent() {
return createComponent()
.bind<fruit::Annotated< FirstI, IInterface>, FirstIImpl>()
.bind<fruit::Annotated<SecondI, IInterface>, SecondIImpl>();
}
Аннотированный инъекции новая функция Fruit 2.x, у меня не было времени, чтобы документировать его пока (извините). Надеюсь, приведенный выше пример должен быть тем, что вы хотели, если не сообщите мне.
Если вы хотите связать два интерфейса с одним и тем же типом, вам также нужно будет аннотировать класс реализации, чтобы у вас было 2 узла (объектов) на графике инъекции вместо 1. Например:
Component<A> getAComponent() {
return createComponent()
.bind<fruit::Annotated< FirstI, IInterface>,
fruit::Annotated< FirstI, IImpl>>()
.bind<fruit::Annotated<SecondI, IInterface>,
fruit::Annotated<SecondI, IImpl>>();
}
Вы пытались связаться с разработчиками? –
Нет, у меня есть много примеров и проверили их github –