2009-08-17 14 views
2

私はここでかなりのグーグルと検索を行っていますが、同様の質問や回答は見つかりませんでした。そこStructureMapプロファイルを使用して名前付きインスタンスをセットアップする方法は?

ForRequestedType<IFoo>() 
    .AddInstances(x => { 
     x.OfConcreteType<FooA>().WithName("FooA"); 
     x.OfConcreteType<FooB>().WithName("FooB"); 
    }); 

問題ありません:あなたは、単一のPluginTypeのために複数の名前付きインスタンスを追加することができ、一般的なSM構成で

。問題は、プロファイルを作成するときに同じことをすることができないということです。私はあなたが定期的に設定して上記実行できるのと同じPluginTypeのために複数の名前付きインスタンスを追加する方法を見つけるように見えることはできません

CreateProfile("Default", p => { 
    p.For<IFoo>().UseConcreteType<FooC>(); 
    }); 

:プロファイルを使用する方法を説明する例のほとんどは、渡されたProfileExpressionFor<>()メソッドを使用します。 ProfileExpressionで利用できる唯一の他の方法はType<>()ですが、この目的に使用できるかどうかはわかりません。

編集:私の代わりにFor<>()Type<>()を使用しようと、それは正しい方向に私を取っているようだが、私は別の問題にぶつかりました。良いことは、ここで私が何をしようとしているのより良い例だ説明するには(これは私がまだのStructureMap、ユーザーグループ、応答なしに投稿されたものです):だから

ObjectFactory.Initialize(x => { 
    x.CreateProfile("Nissan", p => 
    { 
     p.Type<ICar>().Is.OfConcreteType<NewNissanCar>().WithName("New"); 
      p.Type<ICar>().Is.OfConcreteType<OldNissanCar>().WithName("Old"); 
    }); 

    x.CreateProfile("Honda", p => 
    { 
     p.Type<ICar>().Is.OfConcreteType<NewHondaCar>().WithName("New"); 
     p.Type<ICar>().Is.OfConcreteType<OldHondaCar>().WithName("Old"); 
    }); 

}); 

ObjectFactory.Profile = "Nissan"; 

ICar newCar = ObjectFactory.GetNamedInstance<ICar>("New"); // -> returns NewHondaCar 
ICar car = ObjectFactory.GetInstance<ICar>(); // -> returns OldNissanCar 

私がプロフィールを設定していても " Nissan "GetNamedInstance<>("New")が不正なプロファイルからインスタンスを返しました。NewHondaCarの代わりにNewNissanCarが返されています。

興味深いことに、GetInstance<>()は正しいプロファイルを使用し、私は、インスタンス名を渡すことができないので、それはICarを実装し、そのプロファイル(私はそれだけで、そのインターフェイスのための追加された最後のコンクリート型を返す推測)から任意の具体的なタイプを返します。

答えて

0

私は構文上の100%わからないんだけど、私はこれが正しいと信じている:

container = new Container(x => { 

    x.ForRequestedType<IFoo>() 
     .AddInstances(y => 
     { 
      y.OfConcreteType<FooA>().WithName("FooA"); 
      y.OfConcreteType<FooB>().WithName("FooB"); 
     }); 

    x.CreateProfile("Default") 
     .For<IFoo>().UseNamedInstance("FooA"); 

}); 
+0

既存の名前付きインスタンスを再利用したい場合にはうまくいくはずです。残念ながら、新しいコンクリート型を登録して名前を付けたいと思います。私が質問で与えた例を見て、私はプロフィールでFooAをもう一度使ってはいけないと思う。私は私の意図を明確にするためにそれを修正しようとします。 – khaledh

0

それは、プロファイルレベルでインスタンスという名前のStructureMapの点のようには見えません。私はSM 2.6.3で車のサンプルを試したところ、同じ結果が得られました。またObjectFactory.WhatDoIHave()の出力にそれを見ることができます。

ICar (ConsoleApplication1.ICar)      
Scoped as: Transient 
     "New" Configured Instance of ConsoleApplication1.NewHondaCar, ConsoleApplication1 
     "Old" Configured Instance of ConsoleApplication1.OldHondaCar, ConsoleApplication1 

プロファイルは、それがサポートされていない理由を説明することになるだけでなく名前を使用して内部的に実装されるかもしれないように見えます。私は、プロファイルごとに非名前付きインスタンスを登録するとき、私は出力でこれを参照してください。プロファイルの名前は、実際にインスタンスキーの名前の一部であり、どのように

ICar (ConsoleApplication1.ICar)      
Scoped as: Transient 
     "Default Instance for Profile Nissan" Configured Instance of ConsoleApplication1.NewNissanCar, ConsoleApplication1 
     "Default Instance for Profile Honda" Configured Instance of ConsoleApplication1.NewHondaCar, ConsoleApplication1 

注意してください。私はコードを歩いていないが、これは起こっているようだ。

関連する問題