私はここでかなりのグーグルと検索を行っていますが、同様の質問や回答は見つかりませんでした。そこ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>();
});
:プロファイルを使用する方法を説明する例のほとんどは、渡されたProfileExpression
のFor<>()
メソッドを使用します。 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
を実装し、そのプロファイル(私はそれだけで、そのインターフェイスのための追加された最後のコンクリート型を返す推測)から任意の具体的なタイプを返します。
既存の名前付きインスタンスを再利用したい場合にはうまくいくはずです。残念ながら、新しいコンクリート型を登録して名前を付けたいと思います。私が質問で与えた例を見て、私はプロフィールでFooAをもう一度使ってはいけないと思う。私は私の意図を明確にするためにそれを修正しようとします。 – khaledh