无法在xml配置中将依赖项对象配置为构造函数参数

时间:2013-04-03 17:08:12

标签: xml configuration castle-windsor

[这类似于:(stackoverflow: multiple constructors)]

我有以下课程:

使用以下构造函数

“ServiceHost:IServiceHost”:

“public ServiceHost(ServiceBase baseService)”

[注意,这实际上是“System.ServiceProcess.ServiceBase”]的衍生物。 如果我手动 - 在代码中 - 传入我的“ServiceToHandle:ServiceBase”作为“baseService”参数,一切都很好。现在,我尝试通过xm-configuration执行相同操作,并配置了两个映射:

<component id="TheServiceToControl"
   service="ServiceDemo.ServiceToHandle, ServiceToHandle1"
   type="ServiceDemo.ServiceToHandle, ServiceToHandle1"
>
</component>

<component id="TheServiceController-AKA-ServiceHost"
   service="ServiceDemo.IServiceHost, IServiceHost"
   type="ServiceDemo.ServiceHost, ServiceHost"
>
    <parameters>
        <serviceBase>${TheServiceToControl}</serviceBase>
    </parameters>

</component>

我正在加载时:

var container = new WindsorContainer(new XmlInterpreter());
IServiceHost host = container.Resolve<IServiceHost>();

我期待一个已配置的主机对象,必须使用附加的“TheServiceToControl”构造 object,(我的对象)派生自“System.ServiceProcess.ServiceBase”。但我得到一个丑陋的错误:

未处理的异常:Castle.MicroKernel.Handlers.HandlerException:无法创建组件 'TheServiceController-AKA-ServiceHost',因为它具有满足的依赖性。

'TheServiceController-AKA-ServiceHost'正在等待以下依赖项: - 服务'System.ServiceProcess。 ServiceBase '未注册。

我尝试添加System.ServiceProcess程序集,但我发现没办法,可以制作它!

如果有人可能会解释,这里发生了什么,那将是非常棒的!我不希望必须在层次结构中创建所有对象。

无论如何,谢谢你 最好的问候!

2 个答案:

答案 0 :(得分:0)

我认为您必须使用ServiceBase注册ServiceDemo.ServiceToHandle 即。

<component id="TheServiceToControl"
   service="ServiceDemo.ServiceBase, ServiceToHandle1"
   type="ServiceDemo.ServiceToHandle, ServiceToHandle1"
>
</component>

在解析TheServiceController-AKA-ServiceHost时,它将查找服务ServiceBase,而不是它的派生类型。 这样你也应该能够省略TheServiceController-AKA-ServiceHost

的参数部分

亲切的问候, Marwijn。

答案 1 :(得分:0)

非常感谢;我 - 直到现在;-) - 昨晚太累了,回答 我自己的问题;-) ....

我误解了xml-tag是什么。它是参数名称 我在构造函数签名中的方法。就是这样:

public ServiceHost(ServiceBase baseService)

此配置成功:

        <component id="TheServiceController-AKA-ServiceHost"
               service="ServiceDemo.IServiceHost, IServiceHost"
               type="ServiceDemo.ServiceHost, ServiceHost"
        >
            <parameters>
                <baseService>${TheServiceToControl}</baseService>
            </parameters>

        </component>

因此,“baseService”必须匹配,而不是类型。

但很多,非常感谢!

BR, ++ mabra