Разрешает ли Castle Windsor разрешение типов значений? - PullRequest
3 голосов
/ 06 ноября 2008

Я пытаюсь передать параметр в компонент, который требует 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>

но это побеждает цель.

1 Ответ

4 голосов
/ 06 ноября 2008

Что происходит (из того, что я вижу), так это то, что свойство 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);

Однако, вместо того, чтобы использовать ваш подход, я бы предложил реализовать собственный преобразователь типов, как описано в документации к замку .

Таким образом, вы можете разработать свою собственную сокращенную форму для временного промежутка, например, «15 м» или «2 ч 15 м», или что угодно, что вам захочется - сделать вашу конфигурацию немного проще для чтения и обслуживания, а также для решения проблем, с которыми вы столкнулись в настоящее время.

...