2016-05-08 7 views
1

Ich habe Klasse A und Interface IInterface. Ich brauche 2 MitgliederC++ - Abhängigkeits-Injektion mit Früchten

So IInterface in A. zu injizieren:

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

Kann ich injizieren 2 Mitglieder (i1 und i2) in eine mit Obst DI Rahmen?

+0

Haben Sie versucht, die Entwickler zu kontaktieren? –

+0

Nein, ich habe viele Beispiele gegoogelt und ihre Github überprüft –

Antwort

8

Ich bin der Obst-Autor (danke Alan, dass er mich auf diesen Thread hingewiesen hat!). Die einfachste Art, diese Klasse zu injizieren, wäre die Konstruktorinjektion. Unter der Annahme, dass die beiden Schnittstellen gleich sind (wie in Ihrem Beispiel), und Sie wollen zwei verschiedene Instanzen, könnten Sie kommentierten Injektion verwendet werden, die wie folgt aussehen würde:

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) {} 
}; 

In Ihrer get*Component() Funktion werden Sie dann binden beide (auf den gleichen Typ oder verschiedene Typen sind die beiden völlig unabhängig, da sie unterschiedliche Anmerkungen haben):

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>(); 
} 

Kommentierte Injektion ist eine neue Funktion in Fruit 2.x, habe ich keine Zeit gehabt, es zu dokumentieren noch (Entschuldigung). Hoffentlich sollte das obige Beispiel das sein, was Sie wollten, wenn nicht, lassen Sie es mich wissen.

Wenn Sie die beiden Schnittstellen an denselben Typ binden möchten, müssen Sie auch die Implementierungsklasse mit Anmerkungen versehen, sodass Sie 2 Knoten (Objekte) im Injektionsdiagramm anstelle von 1 haben. Beispiel:

Component<A> getAComponent() { 
    return createComponent() 
     .bind<fruit::Annotated< FirstI, IInterface>, 
       fruit::Annotated< FirstI, IImpl>>() 
     .bind<fruit::Annotated<SecondI, IInterface>, 
       fruit::Annotated<SecondI, IImpl>>(); 
} 
+0

Super! Das ist genau das, was ich brauche. Danke für deine Antwort, Marco! –

Verwandte Themen