2014-01-21 6 views
2

Я следующий код:Как настроить параметры типового типа в xml-конфигурации для замка-виндзора?

public class TestClass 
{ 
    public string Foo { get; set; } 
    public ITest<string> Test { get; set; } 
} 

[Convertible] 
public interface ITest<T> 
{ 
    T Param { get; set; } 
} 

[Convertible] 
public class Test<T> : ITest<T> 
{ 
    public T Param { get; set; } 
    public string OtherParam { get; set; } 
} 

И я хотел бы использовать его

WindsorContainer container = new WindsorContainer(new XmlInterpreter()); 
var t = container.Resolve<TestClass>(); 

Я не хочу использовать Fluent конфигурации, но XML-конфигурации. Также я хотел бы избежать явной регистрации компонентов для ITest. Это так, что он может быть сконфигурирован только с одной регистрацией компонента (TestClass), и все параметры могут быть указаны в параметрах < >. Но в настоящее время мне не удалось создать рабочую конфигурацию, она создает null Объект TestClass или TestClass с свойством Test установлен в null.

Моя конфигурация:

<component id="Service.Main" 
     type="ConsoleApplication1.TestClass" 
     lifestyle="transient"> 
    <parameters> 
     <foo>foo string</foo> 
     <Test> 
     <Param>param string</Param> 
     <OtherParam>sdgsdfgdf</OtherParam> 
     </Test> 
    </parameters> 
    </component> 

Может быть кто-то может посоветовать правильную конфигурацию? Thnx

ответ

2

Итак, у меня есть источники для версии 3.2.0. Добавить простое консольное приложение и проверить разные версии с помощью отладки.

Здесь работает решение:

<component id="Service.Main" 
     type="ConsoleApplication1.TestClass" 
     lifestyle="transient"> 
    <parameters> 
     <foo>foo string</foo> 
     <Test> 
     <parameters type="ConsoleApplication1.Test`1[[System.String, mscorlib]], ConsoleApplication1"> 
      <Param>param string</Param> 
      <OtherParam>sdgsdfgdf</OtherParam> 
     </parameters> 
     </Test> 
    </parameters> 
    </component> 

Важные примечания:

  1. Мы должны использовать для последующих сложных свойств, в противном случае он не может "видеть" весь список параметров. Он получает только первого ребенка: ConfigurationParametersInspector.cs, line 58
  2. Мы должны явно указать тип параметра, представленный свойством, с типом интерфейса. Мы можем ожидать, что атрибут типа должен использоваться для узла & ltTest >, но на самом деле только дочерние узлы XML передаются методу, который выбирает тип свойства.
    • Если мы не даем атрибут типа, мы не с ConverterException: DefaultComplexConverter.cs, line 83
    • Здесь мы получаем < параметров > с типом атрибута (и свободный родительский узел атрибутов, так что, если мы устанавливаем тип для < Тест > он будет потерян: ConfigurationParametersInspector.cs, line 59
    • А вот метод, который выбрал реализацию интерфейса в зависимости от атрибута типа: DefaultComplexConverter.cs, line 75

В любом случае конфигурация проверена с 3.2.0, и она работает.

 Смежные вопросы

  • Нет связанных вопросов^_^