Khi tôi có các thực thể trong miền của mình với danh sách các thứ, chúng có nên được hiển thị dưới dạng ILists hoặc IEnumerables không? Ví dụ, Order có một loạt OrderLines.
Khi tôi có các thực thể trong miền của mình với danh sách các thứ, chúng có nên được hiển thị dưới dạng ILists hoặc IEnumerables không? Ví dụ, Order có một loạt OrderLines.
Câu trả lời:
IEnumerable<T>
đại diện cho một loạt các mục mà bạn có thể lặp đi lặp lại (ví dụ sử dụng foreach), trong khi đó IList<T>
là một bộ sưu tập mà bạn có thể thêm hoặc xóa khỏi.
Thông thường, bạn sẽ muốn có thể sửa đổi Đơn hàng bằng cách thêm hoặc xóa Đơn hàng cho đơn hàng, vì vậy bạn có thể muốn Order.Lines là một IList<OrderLine>
.
Đã nói rằng, có một số quyết định thiết kế khung bạn nên đưa ra. Ví dụ, có thể thêm cùng một thể hiện của OrderLine vào hai đơn hàng khác nhau không? Chắc là không. Vì vậy, nếu bạn muốn có thể xác thực xem có nên thêm OrderLine vào đơn hàng hay không, bạn thực sự có thể muốn hiển thị thuộc tính Lines chỉ là một IEnumerable<OrderLine>
và cung cấp các phương thức Add (OrderLine) và Remove (OrderLine) có thể xử lý xác nhận đó.
IReadOnlyList
hoặc IReadOnlyCollection
nếu bạn cần danh sách cụ thể hóa nhưng bạn không muốn thêm hoặc xóa khỏi danh sách.
IReadOnlyList
không có ý nghĩa.
Hầu hết thời gian tôi kết thúc với IList trên IEnumerable vì IEnumerable không có phương thức Count và bạn không thể truy cập bộ sưu tập thông qua một chỉ mục (mặc dù nếu bạn đang sử dụng LINQ, bạn có thể giải quyết vấn đề này bằng các phương thức mở rộng).
ElementAt
phương pháp thì sao?