2012-11-06 45 views
0

我有一個Foo和Foo1類,它們都實現了IFoo。 IFoo的默認映射是StructureMap中的Foo。但是,對於一些用戶,我想將IFoo映射到Foo1。我有一個0123xx塊Application_BeginRequestGlobal.asax將IFoo映射到Foo1爲特定用戶。但是,每當我這樣做時,所有用戶都開始使用Foo1而不是Foo。在Global.asax中爲特定用戶配置Application_BeginRequest上的結構映射

我試過所有的生命週期,如HttpContextLifecycle,UniquePerRequestLifecycle,HttpContextLifecycle,但沒有奏效。

這裏是我使用的代碼:從您的應用程序的啓動階段後改變容器的配置

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

回答

0

預防。正如您所遇到的,這不僅使您的配置難以遵循,而且在多線程應用程序中很難做到這一點。

當您爲每個請求創建一個容器實例時,將解決此特定問題。但是,這可能會導致嚴重的性能下降,並且很難進行簡單的註冊,如單例。所以,不要這樣做。

相反,你應該註冊一個工廠委託,它允許從FooFoo1切換:

container.Configure(r => r.For<IFoo>() 
    .LifecycleIs(new HttpContextLifecycle()) 
    .Use(() => 
    { 
     if (someCondition) 
      return container.GetInstance<Foo>(); 
     else 
      return container.GetInstance<Foo1>(); 
    })); 
相關問題