Проблема с инжектором конструктора - PullRequest
0 голосов
/ 14 марта 2011

Когда создается MainClass, вызывается public MyWindsorClass (IMyInterface obj) {}, а когда создается MainClass2, также вызывается public MyWindsorClass (IMyInterface obj) {}, когда я ожидаю вызова public MyWindsorClass () {}. Что именно я делаю не так? У меня проблема с инжектором конструктора. Вот пример:

class Program
{
    static void Main(string[] args)
    {
        var container = new WindsorContainer(new XmlInterpreter());
        var objs = container.ResolveAll<IMyWindsorInterface>();
    }
}

public interface IMyWindsorInterface { }

public class MyWindsorClass : IMyWindsorInterface
{
    public MyWindsorClass() {}
    public MyWindsorClass(IMyInterface obj) {}
}

public interface IMyInterface { }
public class MyInjectedClass : IMyInterface{ }

<castle>
     <components>
        <component id="MainClass"
             service="CastleTest.IMyWindsorInterface, CastleTest"
             type="CastleTest.MyWindsorClass, CastleTest"
             inspectionBehavior="None"
             lifestyle="Transient">
       <parameters>
          <obj>${blah}</obj>
       </parameters>
        </component>
    <component id="MainClass2"
               service="CastleTest.IMyWindsorInterface, CastleTest"
               type="CastleTest.MyWindsorClass, CastleTest"
               inspectionBehavior="None"
               lifestyle="Transient" />
         <component id="blah" 
             service="CastleTest.IMyInterface, CastleTest" 
             type="CastleTest.MyInjectedClass, CastleTest" 
             inspectionBehavior="None"/>
     </components>
</castle>

Когда создается MainClass, вызывается public MyWindsorClass (IMyInterface obj) {}, а когда создается MainClass2, также вызывается public MyWindsorClass (IMyInterface obj) {}, когда я ожидаю вызова public MyWindsorClass () {}. Что именно я делаю не так? Спасибо всем, кто может помочь!

1 Ответ

2 голосов
/ 14 марта 2011

Windsor по умолчанию автоматически связывает все доступные зависимости. В вашем случае IMyInterface доступен как компонент, поэтому Windsor выберет конструктор, который может удовлетворить большинство зависимостей.

Вы можете изменить это поведение ad-hoc, удалив конструктор из модели компонента, чтобы Windsor больше его не «видел»:

var container = new WindsorContainer();
container.Kernel.ComponentModelCreated += model => {
    if (model.Name == "MainClass2")
        model.Constructors.Remove(model.Constructors.First(c => c.Dependencies.Any(m => m.TargetType == typeof(IMyInterface))));
};
container.Install(Configuration.FromAppConfig());
...