【问题标题】:WindsorCastle child container resolving parent dependency温莎城堡子容器解决父依赖
【发布时间】:2014-10-30 16:36:00
【问题描述】:

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

我有下一个类层次结构:

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 控制器,它应该使用“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 有一个错误。那么它会得到解决吗?对于所描述的场景,我还可以采取什么其他策略?

【问题讨论】:

    标签: asp.net-mvc castle-windsor ioc-container


    【解决方案1】:

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

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

    不幸的是,在 Windsor 3.2 和 3.3 中,子容器路由的行为似乎不如预期(至少与我预期的一样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多