3

我正在尝试将参数传递给需要 System.TimeSpan 的组件。我只能解决“长滴答声” ctor。

这是配置文件的片段:

<component id="timeInForce" type="System.TimeSpan, mscorlib">
  <parameters>
    <hours>0</hours>
    <minutes>15</minutes>
    <seconds>0</seconds>
  </parameters>
</component>

<component id="FooSettings" type="Foo.FooSettings, Foo">
    <parameters>
        <tif>${timeInForce}</tif>
    </parameters>
</component>

这是一个例外:

Castle.MicroKernel.Handlers.HandlerException : Cant create component 'timeInForce'
as it has dependencies to be satisfied. 
timeInForce is waiting for the following dependencies: 

Keys (components with specific keys)
    - ticks which was not registered.

为组件参数传递刻度值是可行的,如下所示:

<parameters><tif>0</tif></parameters>

但这违背了目的。

4

1 回答 1

4

发生的事情(据我所见)是 ticks 属性被错误地标识为强制参数(因为它属于具有最少参数的构造函数),即使所有值类型都有一个默认的无参数构造函数。

但是,即使您提供了其他参数(即刻度),仍然会选择匹配最多参数的构造函数候选者,因此您可以通过在参数列表中包含刻度来解决此问题:

<component id="timeInForce"" type="System.TimeSpan, mscorlib">
<parameters>
  <ticks>0</ticks>
  <hours>0</hours>
  <minutes>15</minutes>
  <seconds>0</seconds>
</parameters>
</component>

这是一个快速测试来验证它是否有效(通过城堡树干):

string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?> 
<castle>
<components>
<component id=""timeInForce"" type=""System.TimeSpan, mscorlib"">
<parameters>
  <ticks>0</ticks>
  <hours>0</hours>
  <minutes>15</minutes>
  <seconds>0</seconds>
</parameters>
</component>
</components>
</castle>";

WindsorContainer container = new WindsorContainer(
  new XmlInterpreter(new StaticContentResource(xml)));

TimeSpan span = container.Resolve<TimeSpan>("timeInForce");

Assert.AreEqual(new TimeSpan(0, 15, 0), span);

但是,我建议而不是您使用的方法是实现您自己的类型转换器,如城堡文档中所述。

这样,您可以为时间跨度开发自己的速记形式,即“15m”或“2h15m”或任何您喜欢的形式 - 使您的配置更易于阅读和维护,并解决您当前遇到的问题。

于 2008-11-06T10:00:20.213 回答