2

ここ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 に複数の名前付きインスタンスを追加する方法が見つからないようです。を介して利用できる他の唯一の方法ProfileExpressionType<>()ですが、この目的に使用できるかどうかはわかりません。

編集: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")、間違ったプロファイルからインスタンスが返されましNewNissanCarNewHondaCar

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

4

2 に答える 2

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

プロファイルの名前が実際にはインスタンスキーの名前の一部であることに注意してください。私はコードをウォークスルーしていませんが、これが起こっているように見えます。

于 2012-07-17T15:56:33.260 に答える
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");

});
于 2009-08-18T01:04:32.167 に答える