2017-12-18 7 views
1

での使用のために(別のコンストラクタ値で)インタフェースの異なるインスタンスを作るために、私はこのクラスとインタフェースを持っている:私はBox1のコンストラクタにBookオブジェクトを渡したいのStructureMap - どのように異なるクラスのコンストラクタ

Public interface IBook{ 
} 

public class Book:IBook 
{ 
    public Book(int num){ 
     //... 
    } 
} 

//------------------------------------------------------ 

Public interface IBox{ 
} 

Public interface IBoxA:IBox{ 
} 

Public interface IBoxB:IBox{ 
} 

Public interface IBoxC:IBox{ 
} 

//------------------------------------------------------ 

public class Box1:IBoxA 
{ 
    public Box1(IBook myBook, ..........){ 
     //... 
    } 
} 

public class Box2:IBoxB 
{ 
    public Box2(IBook myBook, ..........){ 
     //... 
    } 
} 

public class Box3:IBoxC 
{ 
    public Box3(IBook myBook, ..........){ 
     //... 
    } 
} 

Box2 & Box3StructureMap IOCですが、それぞれがコンストラクタで異なる値を持つ必要があります。

本当に私は、魔女Bookオブジェクト(魔女の魔法のパラメータ値)を決定するメカニズムを魔法使いBoxクラスに渡す必要があります。 Boxクラスをインスタンス化するための条件です。より良い説明のために

次の画像を参照してください。

enter image description here

私は、以下の設定を記述します。

For<IBoxA>() 
    .HybridHttpOrThreadLocalScoped() 
    .Use<Box1>(); 

For<IBoxB>() 
    .HybridHttpOrThreadLocalScoped() 
    .Use<Box2>(); 

For<IBoxC>() 
    .HybridHttpOrThreadLocalScoped() 
    .Use<Box3>(); 

ForConcreteType<Box1>() 
     .Configure 
     .Ctor<IBook>("myBook") 
     .Is(new Book(1)); 

ForConcreteType<Box2>() 
     .Configure 
     .Ctor<IBook>("myBook") 
     .Is(new Book(2)); 

ForConcreteType<Box3>() 
     .Configure 
     .Ctor<IBook>("myBook") 
     .Is(new Book(3)); 

しかし、実際にBox1Box2Box3はそのコンストラクタで多くのパラメータを持っており、そのうちの1つはIBook myBookです。私はBox1Box2およびBox3のコンストラクタに適切なオブジェクトを設定するだけで、設定をどのように設定することができるのか分かりません。


EDIT1:

私の実際のプロジェクトが異なっていると私はそれの削減名との関係で私の質問を簡素化しようとした、私が実際のプロジェクトでいくつかのミスを持っているが、私ことは可能です次のようなエラーが表示されます。

No default Instance is registered and cannot be automatically determined for type 'IBook' There is no configuration specified for 'IBook'上記のシナリオでIBookの別の設定を定義する必要がありますか?

私のコードは(魔女Boxに)それがどこにあるかに依存しているIBook»»BookBookは、パラメータとそのパラメータの値を持つコンストラクタを持っているので、ためない別の設定があります。

+0

提供した設定(コードの最後のブロック)で何が間違っていますか? – Evk

+0

@エバーク、この方法または別の方法をお勧めしますか? – RAM

+0

私はまだよく分かりません。あなたが必要としていることを理解しているかどうか、もしそうならあなたが気に入らないものを見つけようとしています。 – Evk

答えて

2

私はあなたの本当の例では、一般的にはあなたが必要とするすべてがどこにあるかうまくいかないのかわからないんだけど:

c.For<IBoxA>()      
    .Use<Box1>() 
    .Ctor<IBook>().Is(new Book(1)); 

c.For<IBoxB>()      
    .Use<Box2>() 
    .Ctor<IBook>().Is(new Book(2)); 

c.For<IBoxC>()      
    .Use<Box3>() 
    .Ctor<IBook>().Is(new Book(3)); 

およびインターフェース(そうIBoxBなくBox2)を使用して解決する:

var box = container.GetInstance<IBoxB>(); 
+0

ありがとう...あなたのパターンと問題を解決して私の設定を変更しました。私は自分の設定とあなたの設定との違いは分かりませんが、設定は短くて動作します。 – RAM

関連する問題