2009-07-14 32 views
5

Từ Hướng dẫn thiết kế khung:Nên ghi đè Object.Equals cho đối tượng (trong DDD)?

KHÔNG thực hiện bình đẳng giá trị đối với các loại tài liệu tham khảo có thể thay đổi. [P-270]

Từ DDD Eric Evans của:

Mỗi ENTITY phải có một cách hoạt động của việc thiết lập bản sắc của mình với đối tượng khác. [p-94]

Tôi có nên coi trọng đối tượng.Phương pháp phương thức là hoạt động nhận dạng hoặc chỉ so sánh thuộc tính Identity (ví dụ: customer1.Id == customer2.Id)?

Trả lời

7

Có ba trường hợp bạn có thể muốn phân biệt.

  1. Bạn có hai tham chiếu đến cùng một thực thể. Trong trường hợp này, các toán tử bình đẳng bình thường sẽ thực hiện công việc của họ một cách chính xác. Không cần phải ghi đè lên bất cứ điều gì.

  2. Bạn có hai phiên bản trong bộ nhớ của cùng một thực thể. Khi bạn thiết kế kho lưu trữ của bạn ngay tình huống này là tránh được nhưng đôi khi đây là một tình huống bạn sẽ phải làm việc với. Ví dụ customer1.Id == customer2.Id của bạn sẽ hoạt động tốt trong trường hợp này.

  3. Bạn có hai thực thể khác nhau nhưng bạn muốn biết liệu chúng có giá trị thuộc tính tương tự hay không. Đây có thể là một mùi mã. Bạn có thể đang xử lý một loại giá trị làm thực thể. Nếu điều này thực sự là một cái gì đó bạn muốn làm thì bạn nên thực hiện nó một cách riêng biệt từ các cơ chế .net == và .Equals bình thường. (ví dụ .IsSameAs (Chủ đề khách hàng)) để tránh nhầm lẫn.

+0

Ý của bạn là gì khi "thiết kế các kho lưu trữ của bạn đúng"? Làm thế nào để bạn tránh được vấn đề của nhiều hơn một thể hiện trong bộ nhớ? – dthrasher

+0

Bạn có thể có kho lưu giữ một từ điển tham chiếu đến các đối tượng được nạp và id của chúng. Bất cứ khi nào một đối tượng là cần thiết hai lần chỉ cần trả về một tham chiếu đến cùng một đối tượng. Hầu hết ORM làm điều này cho bạn – Mendelt

0

Trong trường hợp bạn xem xét ghi đè Object.Equals bạn phải nhớ rằng bạn cũng phải ghi đè GetHashCode().

Các vấn đề liên quan