我的任务是在顶级依赖项属于某种类型时注入特定的非直接子依赖项。我尝试用子容器实现这一点,但它没有按照我的预期发挥作用。
我有一个下一个类层次结构:
PRMController: ApiController
-> PManager: IManager
-> Repository: IRepository
-> RepositoryConnection: IRepositoryConnection
RepositoryConnection() { /*use default config name*/ }
RepositoryConnection(string configName)
windsor容器有下一个注册:
container.Register(Classes.FromAssemblyInThisApplication()
Pick()
.Configure(c =>
{
c.Named(Guid.NewGuid().ToString());
c.IsFallback();
})
.WithService.DefaultInterfaces()
.LifestyleTransient()
);
var childContainer = new WindsorContainer()
.Register(
Component.For<IRepositoryConnection>().ImplementedBy<RepositoryConnection>()
.DependsOn(Dependency.OnValue("configName", "PRM"))
.LifestyleTransient()
);
container.AddChildContainer(childContainer);
现在对于PRM控制器,它应该使用&#34; PRM&#34;配置名称。因此子容器用于解析PRM控制器。但RepositoryConnection
使用默认配置解析。
childContainer.Resolve<IRepositoryConnection>(); //as expected, resolves from child container registrations
childContainer.Resolve<PRMController>(); //NOT as expected, the underlying repositoryConnection is from parent container
有人可以对此有所了解吗? 我认为windsor更喜欢子容器依赖项,如果它们存在,即使从父容器中注册的类型在子容器内解析也是如此。 如果这是不可能实现的,如果有人能引导我朝着正确的方向前进,我将不胜感激。
更新 根据{{3}},有一个错误。它会被解决吗?我可以采取哪种策略来描述所描述的场景?
答案 0 :(得分:1)
通过IHandleSelector实现了我想要的功能,因此在HasOpinion
中检查服务以及当前的Url是否用于PRMController
。 SelectHandler
会返回所需的IRepositoryConnection
类型。
我最好坚持使用子容器,因为在控制器工厂我确切知道它是哪个控制器,而使用句柄选择器我需要从Request.Url解析它。
不幸的是,在Windsor 3.2和3.3中,子容器路线似乎没有达到预期的效果(至少和我预期的一样)。