Trong hầu hết mọi trường hợp, khóa chính không phải là một phần của miền doanh nghiệp của bạn. Chắc chắn, bạn có thể có một số đối tượng quan trọng đối với người dùng với các chỉ số duy nhất ( UserName
cho người dùng hoặc OrderNumber
cho đơn đặt hàng) nhưng trong hầu hết các trường hợp, không có doanh nghiệp nào cần phải xác định công khai các đối tượng miền bằng một giá trị hoặc tập hợp giá trị cho bất kỳ ai, nhưng có lẽ là một người dùng hành chính. Ngay cả trong những trường hợp đặc biệt đó, đặc biệt nếu bạn đang sử dụng số nhận dạng duy nhất toàn cầu (GUID) , bạn sẽ muốn hoặc muốn sử dụng khóa thay thế thay vì để lộ khóa chính.
Vì vậy, nếu sự hiểu biết của tôi về thiết kế theo hướng tên miền là chính xác, các khóa chính không cần và do đó không nên bị lộ, và câu đố tốt. Chúng xấu xí và tù túng phong cách của tôi. Nhưng nếu chúng ta chọn không bao gồm các khóa chính trong mô hình miền, sẽ có hậu quả:
- Rõ ràng, các đối tượng truyền dữ liệu (DTO) xuất phát từ các tổ hợp mô hình miền sẽ không có khóa chính
- Sắp tới DTO sẽ không có khóa chính
Vì vậy, có an toàn không khi nói rằng nếu bạn thực sự giữ nguyên trạng thái và loại bỏ các khóa chính trong mô hình miền của mình, bạn nên chuẩn bị để có thể xử lý mọi yêu cầu theo các chỉ số duy nhất trên khóa chính đó?
Nói cách khác, giải pháp nào sau đây là cách tiếp cận chính xác để xử lý việc xác định các đối tượng cụ thể sau khi loại bỏ PK trong các mô hình miền?
- Có thể xác định các đối tượng bạn cần xử lý bằng các thuộc tính khác
- Lấy khóa chính trở lại trong DTO; tức là loại bỏ PK khi ánh xạ từ kiên trì sang miền, sau đó kết hợp lại PK khi ánh xạ từ miền sang DTO?
EDIT: Hãy làm cho bê tông này.
Giả sử mô hình tên miền của tôi là VoIPProvider
bao gồm các trường như Name
, Description
, URL
, cũng như tài liệu tham khảo thích ProviderType
, PhysicalAddress
và Transactions
.
Bây giờ hãy nói rằng tôi muốn xây dựng một dịch vụ web cho phép người dùng đặc quyền quản lý VoIPProvider
s.
Có lẽ một ID thân thiện với người dùng là vô dụng trong trường hợp này; xét cho cùng, các nhà cung cấp VoIP là các công ty có tên có xu hướng khác biệt theo nghĩa máy tính và thậm chí đủ khác biệt theo nghĩa con người vì lý do kinh doanh. Vì vậy, có thể đủ để nói rằng một duy nhất VoIPProvider
hoàn toàn được xác định bởi (Name, URL)
. Vì vậy, bây giờ hãy nói rằng tôi cần một phương pháp PUT api/providers/voip
để người dùng đặc quyền có thể cập nhật VoIP
nhà cung cấp. Họ gửi lên một VoIPProviderDTO
, bao gồm nhiều nhưng không phải tất cả các lĩnh vực từ VoIPProvider
, bao gồm cả một số khả năng làm phẳng. Tuy nhiên, tôi không thể đọc được suy nghĩ của họ và họ vẫn cần cho tôi biết chúng tôi đang nói về nhà cung cấp nào.
Có vẻ như tôi có 2 (có thể 3) tùy chọn:
- Bao gồm khóa chính hoặc khóa thay thế trong mô hình miền của tôi và gửi nó đến DTO và ngược lại
- Xác định nhà cung cấp mà chúng tôi quan tâm thông qua chỉ mục duy nhất, như
(Name, Url)
- Giới thiệu một số loại đối tượng trung gian luôn có thể ánh xạ giữa lớp, miền và DTO theo cách không phơi bày chi tiết triển khai về lớp lưu giữ - nói bằng cách giới thiệu một định danh tạm thời trong bộ nhớ khi đi từ miền sang DTO và ngược lại,