2008-11-06 3 views
3

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

кажется, что имя элемента параметра не соответствует тому, что ожидает 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); 

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

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