2011-03-14 132 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