簡體   English   中英

ICollection在課堂上

[英]ICollection in class

我遇到以下代碼:

public class Basket
{
    public Guid BasketId { get; set; }
    public DateTime Date { get; set; }

    public virtual ICollection<BasketItem> BasketItems { get; set; }

    public Basket()
    {
        BasketItems = new List<BasketItem>();
    }
}

我不太了解的部分是,為什么我們要把

public virtual ICollection<BasketItem> BasketItems { get; set; }

代替

public virtual List<BasketItem> BasketItems { get; set; }

我能想到的一個原因是,當繼承此類時,我們可以使用不同的類型覆蓋BasketItems嗎?

這樣做的其他原因是什么?

因為BasketItems 不需要是列表。 請注意,setter是公開的。 正如您所指出的,它也可以被覆蓋。

它本質上說,只要BasketItems是集合BasketItem ,這就是我們需要知道的。 我們不在乎如何實現集合。

盡可能避免使用具體類型通常是一種好的設計做法。 實際上,它為您帶來了許多強大的優勢,這些優勢在SOLID- SOLID Wikipedia的依賴項倒置原則中已得到充分證明。 長話短說,一個好的設計不會使您陷入困境,因為它允許用戶在他們認為合適的情況下擴展屬性,並降低了維護成本,因為作為作者,您不必為每個實現都創建新的類類型ICollection。

這里的另一個大好處是單元測試。 避免使用具體類型可以簡化單元測試中的依賴關系。 這導致測試更小,更精確。 對於更多信息的好處,這里有一個很好的解釋- 接口如何使單元測試和模擬更容易?

還有一點: ICollection通常也用於DataEntity中的多對多關系。 您可以參考(MSDN: http : //msdn.microsoft.com/zh-cn/library/92t2ye13.aspx )是需要迭代和修改的對象列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM