我有一个Foo和Foo1类,它们都实现了IFoo。 IFoo的默认映射是StructureMap中的Foo。但是,对于一些用户,我想将IFoo映射到Foo1。我在 if
的Application_BeginRequest
上有一个Global.asax
块,它将IFoo映射到特定用户的Foo1。但是,每当我这样做时,所有用户都开始使用Foo1而不是Foo。
我尝试了HttpContextLifecycle
,UniquePerRequestLifecycle
,HttpContextLifecycle
等所有生命周期,但没有效果。
以下是我使用的代码:
StructureMap.ObjectFactory.Configure(config =>
config.For<IFoo>()
.LifecycleIs(new StructureMap.Pipeline.HttpContextLifecycle())
.Use(Foo1)
答案 0 :(得分:0)
在应用程序的启动阶段之后,防止更改容器的配置。正如您所经历的那样,不仅难以实现您的配置,而且在多线程应用程序中实现这一点非常困难。
当您为每个请求创建一个容器实例时,将解决此特定问题。然而,这可能会导致严重的性能损失,并且很难进行简单的注册,例如单身。所以,不要这样做。
相反,您应该注册一个工厂代表,允许从Foo
切换到Foo1
:
container.Configure(r => r.For<IFoo>()
.LifecycleIs(new HttpContextLifecycle())
.Use(() =>
{
if (someCondition)
return container.GetInstance<Foo>();
else
return container.GetInstance<Foo1>();
}));