我有一个foo1类,都实现了ifoo。IFOO的默认映射是结构图中的foo。但是,对于某些用户,我想将ifoo映射到foo1。我在 Global.asax
中的Application_BeginRequest
上有一个 if
块,该块将ifoo映射到foo1的特定用户。但是,每当我这样做时,所有用户都开始使用foo1而不是foo。
我尝试了所有生命周期,例如HttpContextLifecycle
,UniquePerRequestLifecycle
,HttpContextLifecycle
,但不起作用。
这是我使用的代码:
StructureMap.ObjectFactory.Configure(config =>
config.For<IFoo>()
.LifecycleIs(new StructureMap.Pipeline.HttpContextLifecycle())
.Use(Foo1)
在应用程序的启动阶段后,防止更改容器的配置。随着您的经历,不仅使您的配置很难遵循,而且很难在多线程应用程序中正确处理。
当您每个请求创建一个容器实例时,将解决此特定问题。但是,这可能会引起严重的性能,并且很难进行简单的注册,例如单例。所以,不要那样做。
相反,您应该注册一个允许从Foo
切换到Foo1
的工厂委托:
container.Configure(r => r.For<IFoo>()
.LifecycleIs(new HttpContextLifecycle())
.Use(() =>
{
if (someCondition)
return container.GetInstance<Foo>();
else
return container.GetInstance<Foo1>();
}));