엔터티 컬렉션에 대한 IList와 IEnumerable


146

도메인에 항목 목록이있는 엔터티가 있으면 IList 또는 IEnumerables로 노출되어야합니까? 예를 들어 Order에는 많은 OrderLine이 있습니다.


둘 다 구현하는 것이 현명합니까?
PedroC88

4
그렇지 않습니다. IList는 IEnumerable에서 상속합니다.
Unknown1987

답변:


183

IEnumerable<T>는 (예를 들어 foreach를 사용하여) 반복 할 수있는 일련의 항목을 나타내지 만 IList<T>추가하거나 제거 할 수있는 모음입니다.

일반적으로 OrderLine을 추가하거나 제거하여 Order를 수정할 수 있으므로 Order.Lines가 IList<OrderLine>.

그러나 프레임 워크 디자인 결정을 내려야합니다. 예를 들어, 동일한 OrderLine 인스턴스를 두 개의 다른 주문에 추가 할 수 있어야합니까? 아마 아닙니다. 따라서 OrderLine을 주문에 추가해야하는지 여부를 검증 할 수있게하려면 실제로 Lines 특성 만으로 표시 IEnumerable<OrderLine>하고 처리 할 수있는 Add (OrderLine) 및 Remove (OrderLine) 메소드를 제공 할 수 있습니다. 그 유효성 검사.


5
IReadOnlyList또는 IReadOnlyCollection구체화 된 목록이 필요하지만 목록에서 추가하거나 제거하지 않으려는 경우 또는를 사용할 수도 있습니다 .
julealgon 2016 년

그렇다면 IReadOnlyList말이되지 않습니다.
ajeh

24

IEnumerable에는 Count 메서드가 없으며 인덱스를 통해 컬렉션에 액세스 할 수 없기 때문에 IEnumerable을 통해 IList를 사용하는 대부분의 시간이 있습니다 (LINQ를 사용하는 경우 확장 메서드 로이 문제를 해결할 수는 있지만).


1
count 메소드 등에 액세스 해야하는 경우 IEnumerable로 IList 구현을 항상 인스턴스화 할 수 있다고 생각합니다. 예 : IEnumerable <string> enumerable = <some-IEnumerable> List <string> myList = new List <string> (enumerable ); 그러나 컬렉션을 노출하는 방법은 컬렉션 속성을 변경할 수 없는지 (IEnumerable을 사용하여 컬렉션을 수정할 수 없는지) 여부 (IList 읽기)와 같은 고려 사항에 따라 달라집니다.
Sudhanshu Mishra

11
IEnumerable <T> .Count ()는 기본 형식이 Count 속성을 구현하는 ICollection <T>인지 확인합니다.
andleer

"인덱스를 통해 컬렉션에 액세스 할 수 없습니다"- ElementAt방법은 어떻습니까?
ivamax9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.