2011-03-14 131 views
0

创建MainClass时调用public MyWindsorClass(IMyInterface obj){}并在创建MainClass2时公共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创建公共MyWindsorClass(IMyInterface的OBJ){}被调用,在创建时MainClass2公共MyWindsorClass(IMyInterface的OBJ){}当我期待公众MyWindsorClass(也被称为) {} 被称为。我究竟做错了什么?感谢任何人,可以帮助!

+0

@迈克尔:请参见http://meta.stackexchange。 com/questions/16721/how-does-accept-rate-work – 2011-03-14 17:33:42

+0

我觉得所有这些问题中的所有问题答案都没有回答。所以我应该接受一个答案时,它从来没有回答我的问题? – 2011-03-14 17:41:37

+0

没问题。无论如何,任何人都可以回答我的问题,我将非常乐意接受你。:) – 2011-03-14 18:39:21

回答

2

Windsor将默认自动装载所有可用的依赖关系。在你的情况下,IMyInterface作为一个组件可用,所以Windsor将选择能够满足最依赖的构造函数。

您可以从组件模型中移除的构造改变这种行为的ad-hoc所以温莎不能“看”它了:

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()); 
+0

...或者从XML配置中删除MyInjectedClass,因为它看起来你并不真的想要它。注入:) – 2011-03-14 19:04:43

+0

@Igor:它*注入到MainClass组件中。 – 2011-03-14 19:16:50

+0

这是一个例子。我有大约10个对象我想注入实现IMyWindsorInterface。其中一些需要传入IMyInterface,有些则不需要。 – 2011-03-14 19:18:31