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"