2014-10-30 43 views
1

我的任务是注入特定的非直接子依赖项,如果顶级依赖项是某种类型的。我已经尝试使用子容器来实现这一点,但它不像我预期的那样工作。WindsorCastle子容器解决父依赖关系

我有下一个类层次结构:

PRMController: ApiController 
    -> PManager: IManager 
     -> Repository: IRepository 
      -> RepositoryConnection: IRepositoryConnection 
        RepositoryConnection() { /*use default config name*/ } 
        RepositoryConnection(string configName) 

温莎容器旁边都有登记:

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控制器应该用 “PRM” 配置名称。因此,子容器用于解析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存在,即使从父容器中注册的类型的子容器内解析,它也会优先使用子容器依赖项。 如果这是不可行的,如果有人能带领我走向正确的方向,我将不胜感激。

更新: 根据this thread有一个错误。那么它会得到解决吗?我可以采取什么其他策略来描述所描述的场景?

回答

1

已经通过IHandleSelector实现了我想要的,因此在HasOpinion中检查了服务以及当前Url是否为PRMControllerSelectHandler返回所需的类型IRepositoryConnection

我最好坚持使用子容器,就像在控制器工厂一样,我确切地知道它是哪个控制器,而使用句柄选择器时,我需要从Request.Url解析它。

不幸的是,在Windsor 3.2和3.3中,孩子的集装箱路线似乎不像预期的那样(至少如我所料)。