如何将动态依赖项传递给装饰器链底部的typedfactory实例?

时间:2011-02-07 20:09:12

标签: castle-windsor

我喜欢使用装饰链而不是继承,只要我的服务具有Singleton或Transient生活方式(并且它们的依赖关系以相同的方式作用),这就完美无缺。我已经开始使用TypedFactoryFacility为需要某种输入的服务生成工厂,这些输入无法通过ioc容器解析。当装饰链中的某些东西需要工厂并且Windsor拒绝在继承链中传递内联依赖时,我的头痛就开始了。据我所知,这是设计的,但我不同意当你使用一个工厂明确说明你需要产生输出的时候这打破了封装(我认为Windsor应该将内联依赖性传递给工厂可解析的组件,但是我猜它不是那么直接。无论如何,在一天结束时我最终暴露出我的装饰链:

    public ISessionInputOutput Create(Session session)
    {
        IServerInput baseInput = _inputFactory.GetBaseInput(session.CommunicationSocketStream);
        IServerInput threadSafeInput = _inputFactory.GetThreadSafeInput(baseInput);
        IServerOutput output = _outputFactory.Create(session.CommunicationSocketStream);

        ISessionInputOutput baseIO = _sessionIOFactory.GetBaseIO(baseInput, output);
        ISessionInputOutput commandHandlerIO = _sessionIOFactory.GetCommandHandlerIO(baseIO, session);
        ISessionInputOutput errorHandlingIO = _sessionIOFactory.GetErrorHandlingIO(commandHandlerIO, session);

        _releaseInfo.Add(errorHandlingIO, new CreatedIOInformation(baseInput, threadSafeInput, output, baseIO, commandHandlerIO));

        return errorHandlingIO;
    }

在示例中,我使用3个工厂代理,并手动组合输出以生成装饰器链。

我不能像往常一样使用ServiceOverrides来引入新服务。这感觉不对我希望有人可以建议我上面使用的更好的解决方案。

我也试图通过使用子容器来解决这个问题,但这会在堆栈中引入比我喜欢的更多的ioc细节。

1 个答案:

答案 0 :(得分:1)

如果您确实需要启用传递依赖关系,可以通过覆盖RebuildContextForParameter中的DefaultDependencyResolver方法并将true传递给propagateInlineDependencies来启用它。

请注意,这是一把双刃剑。您也可以对此进行过滤,并仅在您解析需要的少数服务之一时启用此行为,并坚持所有其他服务的默认行为。