ここSOでかなりのグーグル検索と検索を行いましたが、同様の質問や回答が見つかりませんでした。
一般的な SM 構成では、単一の PluginType に対して複数の名前付きインスタンスを追加できます。
ForRequestedType<IFoo>()
.AddInstances( x => {
x.OfConcreteType<FooA>().WithName( "FooA" );
x.OfConcreteType<FooB>().WithName( "FooB" );
} );
問題ありません。問題は、プロファイルを作成するときに同じことができないことです。プロファイルの使用方法を説明するほとんどの例For<>()
では、渡された のメソッドを使用していProfileExpression
ます。
CreateProfile( "Default", p => {
p.For<IFoo>().UseConcreteType<FooC>();
} );
上記の通常の構成でできるように、同じ PluginType に複数の名前付きインスタンスを追加する方法が見つからないようです。を介して利用できる他の唯一の方法ProfileExpression
はType<>()
ですが、この目的に使用できるかどうかはわかりません。
編集:Type<>()
代わりに使用しようとしFor<>()
ましたが、正しい方向に進んでいるようですが、別の問題にぶつかりました。よりよく説明するために、私がやろうとしていることのより良い例を次に示します (これは私が structuremap-users グループに投稿したもので、まだ答えはありません):
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
そのため、プロファイルを「日産」に設定してもGetNamedInstance<>("New")
、間違ったプロファイルからインスタンスが返されましNewNissanCar
たNewHondaCar
。
興味深いことに、GetInstance<>()
正しいプロファイルを使用していますが、インスタンス名を渡すことができないため、実装するプロファイルから任意の具象型を返しますICar
(そのインターフェイスに追加された最後の具象型を返すだけだと思います)。