2016-05-08 22 views
1

私はクラスAとインターフェイスIInterfaceを持っています。私は2人のメンバーを注入する必要がある だからA.果物入りC++依存性注入

にメソッドはIInterface:

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

は、私が使用したフルーツのDIフレームワークに2人のメンバー(I1とI2)を注入することはできますか?

+0

開発者に連絡しましたか? –

+0

いいえ、私はグーグルでたくさんの例を見て、ギブスをチェックしました –

答えて

8

私はフルーツの著者です(このスレッドに私を指してくれてありがとう!)。 そのクラスを注入する最も簡単な方法は、コンストラクタインジェクションです。あなたは両方に結合する必要がありますあなたのget*Component()機能で

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

:2つのインタフェースが(あなたの例のように)同じであり、あなたは、2つの異なるインスタンスをしたいと仮定すると、あなたは次のようになり、注釈付きの注射を、使用することができます(彼らは別の注釈を持っているので、同じタイプ、または異なるタイプの、二つは完全に独立している):

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

注釈付き注射はフルーツ2.xでの新機能である、私はそれを文書化する時間がなかったですまだ(申し訳ありません)。うまくいけば、上記の例はあなたが望むものでなければなりません。

2つのインターフェイスを同じタイプにバインドする場合は、実装クラスに注釈を付ける必要があります.1つではなく、2つのノード(オブジェクト)が注入グラフに表示されます。例:

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

恐ろしいです!これは私が必要とするものです。あなたの答え、マルコありがとう! –