构造函数注入问题

时间:2011-03-14 16:05:43

标签: castle-windsor

当创建MainClass时,调用public MyWindsorClass(IMyInterface obj){}并且当创建MainClass2时,当我期望调用公共MyWindsorClass(){}时,也会调用public MyWindsorClass(IMyInterface obj){}。我究竟做错了什么?我遇到构造函数注入的问题。这是一个例子:

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时,当我期望调用公共MyWindsorClass(){}时,也会调用public MyWindsorClass(IMyInterface obj){}。我究竟做错了什么?感谢任何可以提供帮助的人!

1 个答案:

答案 0 :(得分:2)

Windsor默认会自动装配所有可用的依赖项。在您的情况下,IMyInterface可用作组件,因此Windsor将选择能够满足最多依赖项的构造函数。

您可以通过从组件模型中删除构造函数来更改此行为,以便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());