2009-02-19 19 views
7

重要;私はです。StructureMap答えを探しています。 Windsor、Spring、Unity、またはthe othersのいずれかでそれを行う方法を教えてください。StructureMapを使用したプロファイルの設定

IoCのためにStructureMapと遊んでいます。基本的には、コアタイプを定義する「デフォルト」プロファイルとこれを上書き/拡張する名前付きプロファイルがあります。私はと考えていますプロファイルはこれを行うことができますが、私はそれがxmlまたはコードAPIのいずれかで動作するようにすることはできません。具体的には、私は、プロファイル用のコンテナをロードしようとした場合:

container = new Container(); 
container.SetDefaultsToProfile(profile); 

その後、私は、私ははっきりとその名前と(初期にCreateProfileと呼ばれているという事実にもかかわらず、「要求されたプロファイル{name}が見つからない」取得)。

私は間違った木を吠えますか?

(もuser-groupに投稿された)


私は理想的にしたいことは標準(/デフォルト) 種類、その後、別の名前の構成の範囲のために、 オーバーライドを定義することができることです - 設定の一部は、私はグローバル

  • 持っていた場合、すなわち:=>FooIFooを、IBar =>Bar
  • configA:(変更なし)
  • configB:IFoo =>SpecialFoo

私は、これは名前のプロファイルを使用してロードされ、2つのコンテナにマップすることができ信じています。しかしconfigAがconfigBが SpecialFooを返すところ-として、(IFoo用)Fooを返す - 目的は、私がIBar用のコンテナのいずれかに言わせれば、私は Barを得るということで。

誰かが私にこれをどのように設定することができますか? xmlまたは のコードは問題ありません...私はそれを動作させたいだけです。私が必要とするのは、interface-to- 具体的なタイプのマッピング(特別な設定/プロパティ設定なし)です。

答えて

9

トリックは、少なくとも1つのプロファイルをすべて少なくとも1つのルールとして定義することです。ルール(configA)を指定しないと、プロファイルが作成または表示されません。

public interface IFoo { string SayHello(); } 
public class Foo : IFoo { public string SayHello() { return "Hello"; } } 
public class SpecialFoo : IFoo { public string SayHello() { return "Hello Special"; } } 

public interface IBar { } 
public class Bar : IBar { } 

public interface IDummy { } 
public class Dummy : IDummy{ } 

あなたはこのレジストリを定義することができます:

public class MyRegistry : Registry 
{ 
    protected override void configure() 
    { 
     ForRequestedType<IBar>().TheDefault.Is.OfConcreteType<Bar>(); 
     ForRequestedType<IFoo>().TheDefault.Is.OfConcreteType<Foo>(); 
     CreateProfileNotEmpty("configA"); 
     CreateProfileNotEmpty("configB") 
      .For<IFoo>().UseConcreteType<SpecialFoo>(); 
    } 
    StructureMap.Configuration.DSL.Expressions.ProfileExpression CreateProfileNotEmpty(string profile) 
    { 
     return CreateProfile(profile) 
      .For<IDummy>().UseConcreteType<Dummy>(); 
    } 
} 

そしてそれは、これらのテストで動作します:あなたは、簡単なCreateProfileでCreateProfileNotEmptyを置き換える場合

[TestMethod] 
public void TestMethod1() 
{ 
    var container = new Container(new MyRegistry()); 
    Assert.IsNotNull(container.GetInstance<IBar>()); 
    Assert.AreEqual("Hello", container.GetInstance<IFoo>().SayHello()); 

    container.SetDefaultsToProfile("configB"); 
    Assert.IsNotNull(container.GetInstance<IBar>()); 
    Assert.AreEqual("Hello Special", container.GetInstance<IFoo>().SayHello()); 

    container.SetDefaultsToProfile("configA"); 
    Assert.IsNotNull(container.GetInstance<IBar>()); 
    Assert.AreEqual("Hello", container.GetInstance<IFoo>().SayHello()); 
} 

これらのクラスを考えると

configAにデフォルトを設定する行で失敗します。

+1

興味深い。私は明日それを試してみるでしょう。それを+1(そしておそらく "勝利")と考えてください - 私はその時点で票を投じていません;-p –

関連する問題