2016-05-08 2 views
1

У меня есть класс A и интерфейс IInterface. мне нужно вводить 2 члена IInterface в А.инъекция зависимости C++ с фруктами

Итак:

class A { 
    IInterface* i1; 
    IInterface* i2; 
}; 

Могу ли я вводить 2 члена (I1 и I2) в А с использованием рамок фруктов DI?

+0

Вы пытались связаться с разработчиками? –

+0

Нет, у меня есть много примеров и проверили их github –

ответ

8

Я автор фруктов (спасибо Алану за то, что он указал мне на эту тему!). Самый простой способ ввести этот класс в конструкторскую инъекцию. Предполагая, что два интерфейса одинаков (как в вашем примере), и вы хотите 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>>(); 
} 
+0

Awesome! Это именно то, что мне нужно. Спасибо за ваш ответ, Марко! –

Смежные вопросы