ICollection в классе

Я нашел коды ниже:

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 с разными типами?

Какие еще причины для этого?


person Steven Yong    schedule 20.05.2016    source источник
comment
Entity framework может предоставлять реализацию без списка.   -  person Daniel A. White    schedule 20.05.2016
comment
что это значит @Daniel?   -  person Steven Yong    schedule 20.05.2016


Ответы (3)


Как правило, рекомендуется избегать использования конкретных типов, когда это возможно. На самом деле это дает вам множество серьезных преимуществ, которые хорошо документированы в Принципе инверсии зависимостей SOLID - ТВЕРДАЯ Википедия. Короче говоря, не загонять себя в угол - это хороший дизайн, потому что он позволяет пользователю расширять свойство по своему усмотрению и снижает потребность в обслуживании, потому что как автору вам не нужно создавать новый тип класса для каждой реализации. из ICollection.

Еще одно большое преимущество - модульное тестирование. Избегание конкретных типов значительно упрощает имитацию зависимостей в модульных тестах. Это приводит к тому, что тест становится меньше и точнее. Здесь есть хорошее объяснение преимуществ для получения дополнительной информации - Как сделать интерфейсы, упрощающие модульное тестирование и имитирование?

person theogjpeezy    schedule 20.05.2016

Потому что BasketItems не обязательно в списке. Обратите внимание, что установщик является общедоступным. Как вы указали, его также можно переопределить.

По сути, это говорит о том, что пока BasketItems является набором BasketItem, это все, что нам нужно знать. Нам все равно, как реализована коллекция.

person Rob    schedule 20.05.2016
comment
Я подозреваю, что общедоступный сеттер - это ошибка, иначе они не инициализировали бы его в конструкторе. Если вы оставите публичный сеттер без дела, вы должны быть готовы обработать nulls. - person Joel Coehoorn; 20.05.2016

еще одна вещь: ICollection обычно используется в DataEntity также для отношений "много-много / один-много". Вы можете сослаться на (MSDN: http://msdn.microsoft.com/en-us/library/92t2ye13.aspx) - это список объектов, которые необходимо просмотреть и изменить.

person Minh Bui    schedule 20.05.2016