当创建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){}。我究竟做错了什么?感谢任何可以提供帮助的人!
答案 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());