2012-10-23 161 views
2

我有這樣的構造函數:依賴注入重構

public Section() 
    { 
     _tabs = new TabCollection(this); 
     _sections = new SubSectionCollection(this); 
    } 

我希望得到的東西是這樣的:

public Section() 
     : this(new TabCollection(this), new SubSectionCollection(this)) 
    { 

    } 

    public Section(TabCollection tabCollection, IList<ISection> sections) 
    { 
     _tabs = tabCollection; 
     _sections = sections; 

    } 

當然,這是行不通的。任何人有任何建議,我可以重構此代碼? 我需要這樣做才能在單元測試中模擬Section類型的對象。我們正在使用FakeItEasy測試框架。

+1

你在你的第二個例子中有重複的代碼 - 你不需要在第一個構造函數的內容行。除此之外,它不是一個完全依賴注入的解決方案,但我不明白爲什麼代碼會失敗。 –

+0

是的,我的不好,我不使用第一個ctor中的內容行。當我複製粘貼時,我很匆忙。所以第一個ctor不包含任何東西。我需要一個默認的構造函數,以便能夠僞造一個類型爲Section的對象來進行單元測試。 – IonutC

回答

1

一個問題是你的第一個構造函數,沒有參數的構造函數委託給第二個構造函數。換句話說,第二個將被第一個與this()聲明中的參數一起調用。然而,第一個也包含_tabs_sections的setter,這是冗餘的。它應該是這樣的:

public Section() 
    : this(new TabCollection(this), new SubSectionCollection(this)) 
{ } 

public Section(TabCollection tabCollection, IList<ISection> sections) 
{ 
    _tabs = tabCollection; 
    _sections = sections; 
} 

這是構造函數鏈,不過,這是在依賴注入中使用的技術。這是你問的嗎?

+0

是的,你是對的。我需要使用這種鏈接和依賴注入才能僞造Section類型的對象。我知道我應該使用tabcollection和SubSectionCollection的接口,但這不是重點。問題是,因爲我在實例化TabCollection和SubSectionCollection時沒有詞「this」,所以我無法進行鏈接。 – IonutC

1

依賴注入並不一定意味着你的類在構造時不能實例化它的某些字段/屬性。我通常使用構造函數注入「服務」,而不是一組子對象。

但是,我不知道代碼的所有細節,因此您可能需要使用Factory模式。像SectionFactory東西可能使這裏感覺......

public class Section 
{ 
    internal Section(TabCollection tabColl, SectionCollection subSections) 
    { 
     // check for null, etc. 

     // do whatever you need to do to finish construction 
     tabColl.Parent = this; 
     subSections.Parent = this; 
    } 
} 

public class SectionFactory : ISectionFactory 
{ 
    public Section Create() 
    { 
     var tabs = new TabCollection(); 
     var subs = new SectionCollection(); 

     return new Section(tabs, subs); 
    } 
}