0

FooクラスとFoo1クラスがあり、どちらもIFooを実装しています。IFooのデフォルトのマッピングはStructureMapのFooです。ただし、一部のユーザーについては、IFooをFoo1にマップしたいと思います。特定のユーザーのIFooをFoo1にマップするブロックがありifます。しかし、私がこれを行うときはいつでも、すべてのユーザーはFooの代わりにFoo1を使い始めます。Application_BeginRequestGlobal.asax

、、、などのすべてのライフサイクルを試しましHttpContextLifecycleたがUniquePerRequestLifecycleHttpContextLifecycle機能しませんでした。

私が使用するコードは次のとおりです。

  StructureMap.ObjectFactory.Configure(config =>
  config.For<IFoo>()
  .LifecycleIs(new StructureMap.Pipeline.HttpContextLifecycle())
  .Use(Foo1)
4

1 に答える 1

0

アプリケーションの起動段階の後で、コンテナーの構成を変更しないようにします。あなたが経験しているように、これをあなたの構成に従うのを難しくするだけでなく、マルチスレッドアプリケーションでこれを正しくするのは非常に難しいです。

この特定の問題は、リクエストごとに1つのコンテナインスタンスを作成すると解決されます。ただし、これによりパフォーマンスが大幅に低下する可能性があり、シングルトンなどの単純な登録を行うのが非常に困難になります。だから、そうしないでください。

Foo代わりに、からへの切り替えを可能にするファクトリデリゲートを登録する必要がありますFoo1

container.Configure(r => r.For<IFoo>()
    .LifecycleIs(new HttpContextLifecycle())
    .Use(() =>
    {
        if (someCondition)
            return container.GetInstance<Foo>();  
        else
            return container.GetInstance<Foo1>();  
    }));
于 2012-11-06T16:49:31.760 に答える