2011-04-26 45 views
2

我想在Windsor解決了一系列實現此接口的類:注入相同類型的屬性在溫莎

public interface IDocumentParser 
{ 
    Message ParseDocument(XDocument document); 
    IDocumentParser NextParser { get; set; } 
} 

基本上我已經是一個鏈條的責任,其中第一分析器與會代表如果它無法處理文檔,則鏈中的下一個。我想知道溫莎是否有辦法解決這種依賴問題。我嘗試了以下,但它將我的NextParser屬性設置爲null。

container.Register(
    Component.For<IDocumentParser>().ImplementedBy<DocumentParser1>(), 
    Component.For<IDocumentParser>().ImplementedBy<DocumentParser2>(), 
    Component.For<IDocumentParser>().ImplementedBy<DocumentParser3>(), 
    Component.For<IDocumentParser>().ImplementedBy<DocumentParser4>()); 

有什麼建議嗎?

編輯:

好了,它看起來像問題是以下內容:我註冊爲可啓動的(通過StartableFacility),這得到了我的解析器登記前稱爲依賴組件。現在

class DependentObject 
{ 
    public DependentObject(IDocumentParser firstParser) {} 
    public void Start() {} 
    public void Stop() {} 
} 

,它看起來像一個啓動的組成部分,即會爲已註冊開始,從而以某種方式停止解析過程爲所有相關的解析器。對於我來說,我解決了一個DeferredStart()配置StartableFacility,就像這樣:

var container = new WindsorContainer(); 
    container 
    .AddFacility<StartableFacility>(
     // Without this container.Resolve<IDocumentParser>().NextParser is null 
     c => c.DeferredStart()); 
    .Register(
     Component.For<DependentObject>() 
     .StartUsingMethod(m => m.Start) 
     .StopUsingMethod(m => m.Stop), 
     Component.For<IDocumentParser>().ImplementedBy<DocumentParser1>(), 
     Component.For<IDocumentParser>().ImplementedBy<DocumentParser2>(), 
     Component.For<IDocumentParser>().ImplementedBy<DocumentParser3>(), 
     Component.For<IDocumentParser>().ImplementedBy<DocumentParser4>() 
    ); 

我很納悶,不過,爲什麼發生這種情況。在這種情況下,我期望溫莎或者拋出一個異常,指出他無法解決IDocumentParser依賴性問題,或者解決整個鏈,而不僅僅是第一個節點。有人知道這是否是設計?

回答

1

這是設計 - Windsor默認將屬性依賴關係視爲可選屬性,因此當請求屬性時,盡最大努力滿足它,但如果不能,則不會。

如果要強制滿足這些依賴關係,可以使其成爲強制性的或使用服務覆蓋來明確指定它們