在Global.asax中为Application_BeginRequest配置特定用户的结构映射

时间:2012-11-06 14:32:19

标签: asp.net-mvc structuremap

我有一个Foo和Foo1类,它们都实现了IFoo。 IFoo的默认映射是StructureMap中的Foo。但是,对于一些用户,我想将IFoo映射到Foo1。我在 if Application_BeginRequest上有一个Global.asax块,它将IFoo映射到特定用户的Foo1。但是,每当我这样做时,所有用户都开始使用Foo1而不是Foo。

我尝试了HttpContextLifecycleUniquePerRequestLifecycleHttpContextLifecycle等所有生命周期,但没有效果。

以下是我使用的代码:

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

1 个答案:

答案 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>();  
    }));