2015-05-12 2 views
1

Допустим, у меня есть основной компонент, который я хочу инициализировать определенным образом, и у меня есть его конструктор с интерфейсом для этой цели. Есть ли способ определить реализацию, которую я хочу для этого интерфейса в моем xml, и, в свою очередь, ввести это в основной компонент в качестве параметра? Например:Могу ли я передать другие компоненты в конфигурацию Castle Windsor?

public interface IComponent2 { 
    void DoStuff(); 
} 

public class ConcreteCompImpl2 : IComponent2 { 

    IComponent1 _comp; 
    public ConcreteCompImpl2(IComponent1 comp) { 
     _comp = comp; 
    } 

    public void DoStuff(){ 
     //do stuff 
    } 
} 



<component id="component1" service="ABC.IComponent1, ABC" type="ABC.ConcreteCompImpl1, ABC" /> 
<component id="component2" service="ABC.IComponent2, ABC" type="ABC.ConcreteCompImpl2, ABC" >   
    <parameters> 
     <component1>???</component1> 
    </parameters> 
</component> 

Или я думаю об этом все неправильно, и есть намного более простой способ сделать это? Главное, что я хочу сделать, - настроить, что «вид» IComponent1 будет вводиться всякий раз, когда создается IComponent2. Спасибо

ответ

1

Если у вас есть только один конкретный класс, реализующий IComponent1, тогда он будет автоматически вводиться, когда вы разрешите IComponent2.

Если у вас есть несколько классов, реализующих IComponent1 и хотят конкретную один каждый раз, когда IComponent2 не будет решен, необходимо специфической inline dependency:

container.Register(
    Component.For<IComponent2>() 
      .ImplementedBy<Component2>() 
      .DependsOn(Dependency.OnComponent<IComponent1, YourSpecialComponent1>()) 
); 

Я не совсем уверен, что вы можете указать в конфигурации XML , но, честно говоря, вы должны использовать Fluent API вместо XML configuration, если у вас нет убедительной причины для его использования. Как упоминалось в приведенной выше ссылке:

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

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