私たちは同様の状況にあり、あなたの質問の下であなたのコメントのこの部分について話しました:
...Web アプリケーションの 1 つの Web サイト/インスタンスがあり、あなたが誰であるかに応じて、あなたが所属するデータベースに接続します。したがって、状態が異なるシステムに流れ込むのを避けるために、要求ごとに分離されたコンテナーが必要です (ユーザー A はユーザー B のシステムからオブジェクトを取得します)...
マルチスレッドセーフである必要がある同じ機能を探していました。次に、このリンクを見つけました:
StructureMap: Multithreaded env. PluginFamily のデフォルト インスタンスが定義されていません
結果は次のように説明できます。
1) 要件: ソリューションには抽象化があります。StructureMap.ObjectFactory.GetInstance
... の代わりに、すべての部分があなたを呼び出す必要があります
Factory.GetInstance(type)
(およびそのプロバイダー。StructureMap (SM) または後で他のIoCプロバイダーを呼び出します)
2) この場合 (または、たとえば Manager パターンを導入してFactory
、すべてのコードをSMにインデントさせることができる場合)、2 つ (またはそれ以上) のコンテナーを作成できます。
まずデフォルトのもの
public class DefaultProfileRegistry : Registry
{
public DefaultProfileRegistry()
{
// whatever calls needed to initialize this registry
SetScans(this); // scan
SetSetterInjection(this); // DI
Profile("DefaultProfile", SetDefaults); // even some common defaults
}
それでは、別のものを作成しましょうRegistry
public class SpecialProfileRegistry : Registry
{
public SpecialProfileRegistry()
{
DefaultProfileRegistry.SetScans(this); // use part from default
...
Profile("Special", DefaultProfileRegistry.SetDefaults); // common defaults
}
さて、私たちが持っているもの: Two Registry
. 1つはデフォルトで、2つ目は特別で、それから利益を得て一部を調整するか、まったく異なるものにすることができます...
3) それらをIFactoryProvider
インプリStructureMapFactoryProvider
メンター (SMFP)に登録します。
public partial class StructureMapFactoryProvider : IFactoryProvider
{
private static readonly IContainer Special;
static StructureMapFactoryProvider()
{
// 1) the default registry container
ObjectFactory.Initialize(x =>
{
x.UseDefaultStructureMapConfigFile = false;
// Defaults
x.IncludeRegistry<DefaultProfileRegistry>();
});
ObjectFactory.Container.SetDefaultsToProfile("DefaultProfile");
// 2) and now register the other(s)
Special = new StructureMap.Container(new SpecialProfileRegistry());
Special.SetDefaultsToProfile("Special");
}
さて、SMFP に最初に触れると、すべてのコンテナがインスタンス化されます...
4) そして最後に の中でIFactoryProvider.GetInstance()
、何を使うかを決めることができます
object IFactoryProvider.GetInstance(Type type)
{
var useSpecial = ... // get the information to decide
if (useDefault)
{
return Special.GetInstance(type);
}
else
{
return ObjectFactory.GetInstance(type);
}
5)useSpecial
は、この場所で何らかの方法で利用できる必要があります。に依存してはいけませんIFactoryProvider.GetInstance()
。完全なリクエスト処理中にこの値がconstIContainer
である場合、正しいオブジェクトは正しいオブジェクトを提供します。
6) これらのそれぞれは、異なるConventions、異なるLiefCycleIContainer
設定を持つことができます...数千の が登録されている場合でも、このソリューションは非常に優れたパフォーマンスを提供し、マルチスレッドセーフです (たとえば、プロファイルの切り替えはありません)。PluginType