我正在尝试将参数传递给需要System.TimeSpan的组件。我只能得到“长蜱”来解决。
以下是配置文件的片段:
<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>
但这违背了目的。
答案 0 :(得分: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);
然而,我会建议您使用的方法是实现自己的类型转换器,如castle documentation中所述。
通过这种方式,您可以开发自己的速记表单,即“15米”或“2小时15分钟”或任何您喜欢的内容 - 使您的配置更容易阅读和维护,并解决您目前遇到的问题。