Castle windsor 使用子容器时如何解析实例?

Castle windsor 使用子容器时如何解析实例?,castle-windsor,Castle Windsor,在下面的代码片段中,我们有一个根容器和一个子容器。子容器保存Person的注册,该注册取决于根容器中定义的INameProviderINameProvider取决于在两个容器中都有注册的IInfoProvider 当要求子容器解析Person的实例时,该机制使用根容器解析INameProvider的实例(如预期),但也解析iInfo Provider的实例。我希望在子容器中注册iinfo提供者将覆盖根容器中的注册 WindsorContainer rootContainer = new Wind

在下面的代码片段中,我们有一个根容器和一个子容器。子容器保存
Person
的注册,该注册取决于根容器中定义的
INameProvider
INameProvider
取决于在两个容器中都有注册的
IInfoProvider

当要求子容器解析
Person
的实例时,该机制使用根容器解析
INameProvider
的实例(如预期),但也解析
iInfo Provider
的实例。我希望在子容器中注册
iinfo提供者
将覆盖根容器中的注册

WindsorContainer rootContainer = new WindsorContainer();

// register components for root container
rootContainer.Register(
   Castle.MicroKernel.Registration.Component.For<IInfoProvider>().
      ImplementedBy<InfoProvider>().
      LifeStyle.Transient);
rootContainer.Register(
   Castle.MicroKernel.Registration.Component.For<INameProvider>().
      ImplementedBy<BobNameProvider>().
      LifeStyle.Transient);

// create child container
WindsorContainer childContainer = new WindsorContainer();
rootContainer.AddChildContainer(childContainer);

// register components for child container
childContainer.Register(
   Castle.MicroKernel.Registration.Component.For<Person>().
      LifeStyle.Transient);
childContainer.Register(
   Castle.MicroKernel.Registration.Component.For<INameProvider>().
      ImplementedBy<JimNameProvider>().
      LifeStyle.Transient);

var person = childContainer.Resolve<Person>();

Debug.Assert(person.ToString() == "Jim"); // <- fails, because person.ToString is "Bob"
有人能解释为什么第一个示例使用根容器而不是子容器来解析
iInfo提供者吗

是否有更好的模式来处理可以覆盖的不同级别的组件注册

更新#1
我们正在处理的实际情况如下。我们正在开发一个多租户MVC web应用程序,其中公共应用程序功能存储在根容器中,每个租户都有自己的子容器,其中某些内容被覆盖。例如,数据存储的配置存储在每个子容器中(每个租户都有自己的数据库),并且一些MVC控制器是不同的。创建控制器时,我们使用
container.GetChildContainer
查找子容器,并尝试解析所需的对象。我们的控制器间接依赖于数据存储配置,但从未使用在子容器中定义的配置。

Windsor有太多扩展点,以至于子容器在大多数情况下都不是问题的正确解决方案。请详细描述您的实际场景。在寻找其他扩展点时,我遇到了一个描述如何使用
IHandlerSelector
创建上下文概念的扩展点。虽然我很欣赏提出的解决方案,但当每个上下文都有很多组件时,在所有id前面加上上下文的名称似乎有点麻烦。你对此有何看法?这本身就是一个全新的问题。
var np = childContainer.Resolve<INameProvider>();
np.ToString() // <-- equals "Jim"