2008-11-06 67 views
3

我想傳遞一個參數到需要System.TimeSpan的組件中。我只能得到'長蜱'來解決。Castle Windsor是否允許值類型的解析?

這裏是配置文件的一個片段:

<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

似乎參數元素名稱與MicroKernel期望的不匹配:tif代替預期的timeInForce。 $ {timeInForce}應該工作 – smoothdeveloper 2010-06-21 08:50:22

回答

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」或任何您喜歡的內容 - 讓您的配置更容易閱讀和維護,並解決您當前遇到的問題。