0

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

我尝试了所有生命周期,例如HttpContextLifecycle, UniquePerRequestLifecycle, HttpContextLifecycle,但没有奏效。

这是我使用的代码:

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

1 回答 1

0

防止在应用程序启动阶段之后更改容器的配置。正如您所经历的那样,这不仅使您的配置难以遵循,而且在多线程应用程序中很难做到这一点。

当您为每个请求创建一个容器实例时,这个特定问题将得到解决。但是,这可能会导致严重的性能损失,并且会使进行简单的注册(例如单例)变得非常困难。所以,不要那样做。

相反,您应该注册一个允许从 切换Foo到的工厂委托Foo1

container.Configure(r => r.For<IFoo>()
    .LifecycleIs(new HttpContextLifecycle())
    .Use(() =>
    {
        if (someCondition)
            return container.GetInstance<Foo>();  
        else
            return container.GetInstance<Foo1>();  
    }));
于 2012-11-06T16:49:31.760 回答