【问题标题】:Cannot configure dependency object as constructor argument in xml configuration无法在 xml 配置中将依赖对象配置为构造函数参数
【发布时间】:2013-03-25 11:52:45
【问题描述】:

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

我有以下课程:

"ServiceHost:IServiceHost" 带有以下构造函数:

“公共服务主机(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”构建 对象,(我的对象)派生自“System.ServiceProcess.ServiceBase”。但是我遇到了一个丑陋的错误:

未处理的异常:Castle.MicroKernel.Handlers.HandlerException:无法创建组件 'TheServiceController-AKA-ServiceHost' 因为它需要满足依赖关系。

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

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

如果有人能解释一下,这里发生了什么,那就太好了!!我没想到必须创建层次结构中的所有对象。

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

【问题讨论】:

    标签: xml configuration castle-windsor


    【解决方案1】:

    我认为您必须使用以下服务注册您的 ServiceDemo.ServiceToHandle:ServiceBase 即

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

    当解析 TheServiceController-AKA-ServiceHost 时,它将寻找服务 ServiceBase,而不是它的派生类型。 这样,您还应该能够省略 TheServiceController-AKA-ServiceHost 的参数部分

    亲切的问候, 马尔维恩。

    【讨论】:

      【解决方案2】:

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

      我误解了,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, ++马布拉

      【讨论】:

        猜你喜欢
        • 2014-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多