2013-05-28 188 views
1

我是Ninject的新成員,我有一個非常簡單的要求,但我無法在Ninject的文檔中找到我想要的東西。用於測試的簡單依賴注入

我有一類這樣的:

public class User 
{ 
    public string Name {get;set;} 
    ... 
    public ICollection<Address> Addresses {get; protected set;} 
} 

public class Address 
{ 
    public string Street {get;set;} 
    ... 
} 

所以,我的測試類設置需要實例中使用的用戶在很多測試。

[TestClass] 
public class UserTest 
{ 
    User _myUser; 

    [TestInitialize] 
    public void Setup() 
    { 
     _myUser = new User(); 
     _myUser.Addresses.Add(new Address { Street = "Evergreen" }); // <-- Here I need Addresses must be Instantiated as, lets say, List<T> 
    } 
} 

我需要的是一個_myUser.Addresses將與集合的實例注入。 我無法弄清楚如何使用Ninject完成此操作。你能爲我指出正確的方向嗎?

+1

'用戶'和'地址'是實體。一般而言,您只應使用您的DI容器來管理服務。 – Steven

+0

因此,使用依賴注入器創建我的'ICollection '沒有很好的理由,默認情況下有一個具體的實現?如果是這樣,我可以做一些類似'_myUser = new User {Addresses = new List

()}'並且忘記它,並且讓setter公開。 –

+2

你必須記住DI和DI容器的用途:它們幫助你製作你的代碼更加靈活,可測試和可維護,允許您在可能想要更改的抽象背後隱藏邏輯,在(單元)測試期間在項目或邏輯中想要僞造/模擬的生命週期中替換。這個ICollection不可能包含你想在單元測試期間僞造的任何邏輯,或者稍後用其他邏輯代替。你不應該試圖從你的代碼中刪除你所有的'new'語句。區分[Newables和Injectables](http://bit.ly/12MiAuV)。 – Steven

回答

0

你需要的是所謂的「Property Setter Injection」和Ninject has a help page in its wiki的例子。

+0

我真的需要將屬性添加到我的模型嗎?使用更加非侵入性的方式無法實現? –

1

不應該需要Ninject。你可以在你的模型中做這樣的事情。

private ICollection<Address> _addresses; 
public ICollection<Address> Addresses 
{ 
    get { return _addresses ?? (_addresses = new HashSet<Address>()); } 
    protected set { _addresses = value; } 
} 

這就是我在我的模型中做什麼時,我寧願有一個默認的空集合而不是空值。

+0

我明白你的建議,但我想要一個創建集合實例的責任不屬於該類的模型。這是因爲在生產中,創建這個集合的責任取決於NHibernate –

+0

我明白了,我之前沒有使用過NHibernate。我主要使用實體框架與我的模型,它從來沒有與這個設計有關的問題。 – DSlagle

+0

在NHibernate中也不是問題。但是,我認爲集合初始化將是多餘的,因爲NHibernate(或EF)將在生產中關心它。謝謝你的回答 –