2011-11-30 5 views
4
public interface IFoo{} 
public class Foo1 : IFoo { 
    public Foo1(int id){} 
    public Foo1(string val){} 
} 

public class Foo2 : IFoo { 
    public Foo2(int id){} 
    public Foo2(string val){} 
} 

対応するレジストリ設定...のStructureMap:あり、そのために特定のCTOR

ForRequestedType<IFoo>().TheDefault.Is.ConstructedBy(()=>new Foo1("some string val")); 
InstanceOf<IFoo>().Is.OfConcreteType<Foo2>(); 

の使用方法インターフェイスの特定の具体的なインスタンスのセットアップに私たちは、その後、何か他のもののためのparamとしてIFooを使用.. .EX:次のように

public interface IBar{} 
public class Bar1:IBar { 
    public Bar1(IFoo foo){} 
} 

public class Bar2:IBar { 
    public Bar2(IFoo foo){} 
} 

登録そのためには...

ForRequestedType<IBar>().TheDefault.Is.OfConcreteType<Bar1>().CtorDependency<IFoo>().Is<Foo1>(); 
です

今私はBAR2はfoo2はを使用したい、と私はfoo2はは「新しいfoo2は(1)」私は

InstanceOf<Foo2>().Is.ConstructedBy(()=> new Foo2(1)); 

を試してみましたが、それが失敗したコンストラクタを使用します。 どうすれば、これをStructureMapレジストリを使用して動作させることができますか?あなたはあなたの中にこれを行うことができます

答えて

2

は、レジストリ:

For<IFoo>().Use(() => new Foo2(1)).Named("BarFoo"); 
For<IFoo>().Use(() => new Foo1("some string val")); 

For<IBar>().Use<Bar1>().Ctor<IFoo>().Named("BarFoo"); 

を私はこのような結果をテストした:

// this will be a Foo1 instance constructed with a string ctor parameter 
var foo = container.GetInstance<IFoo>(); 

// this will be a Bar1, containing an instance of Foo2, constructed with the int ctor parameter 
var bar = container.GetInstance<IBar>(); 

設定行の小さな説明:

  • ライン1 - IFoo Foo2(int)にバインドする登録 - 「BarFoo」
  • 行2 - Foo1(文字列)にバインドするIFoo登録 - 最後に定義されているため、これはIFooのデフォルトになります
  • 行3 - Bar1にバインドするIBar登録で、 "BarFoo"というバインディングを使用して解決しますIFoo依存性
関連する問題