在application_beginrequest上为特定用户配置结构映射



我有一个foo1类,都实现了ifoo。IFOO的默认映射是结构图中的foo。但是,对于某些用户,我想将ifoo映射到foo1。我在 Global.asax 中的Application_BeginRequest上有一个 if块,该块将ifoo映射到foo1的特定用户。但是,每当我这样做时,所有用户都开始使用foo1而不是foo。

我尝试了所有生命周期,例如HttpContextLifecycleUniquePerRequestLifecycleHttpContextLifecycle,但不起作用。

这是我使用的代码:

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

最新更新