Tôi đang đi sâu vào các khái niệm về Thiết kế hướng tên miền (DDD) và thấy một số nguyên tắc kỳ lạ, đặc biệt là liên quan đến sự cô lập của mô hình miền và mô hình bền bỉ. Đây là sự hiểu biết cơ bản của tôi:
- Một dịch vụ trên lớp ứng dụng (cung cấp một bộ tính năng) yêu cầu các đối tượng miền từ kho lưu trữ mà nó cần để thực hiện chức năng của nó.
- Việc triển khai cụ thể của kho lưu trữ này lấy dữ liệu từ bộ lưu trữ được triển khai cho
- Dịch vụ báo cho đối tượng miền, đóng gói logic nghiệp vụ, để thực hiện một số tác vụ nhất định nhằm sửa đổi trạng thái của nó.
- Dịch vụ báo cho kho lưu trữ để duy trì đối tượng miền đã sửa đổi.
- Kho lưu trữ cần ánh xạ đối tượng miền trở lại biểu diễn tương ứng trong bộ lưu trữ.
Bây giờ, với các giả định ở trên, những điều sau đây có vẻ khó xử:
Quảng cáo 2.:
Mô hình miền dường như tải toàn bộ đối tượng miền (bao gồm tất cả các trường và tham chiếu), ngay cả khi chúng không cần thiết cho chức năng yêu cầu nó. Tải hoàn toàn thậm chí có thể không khả thi nếu các đối tượng miền khác được tham chiếu, trừ khi bạn cũng tải các đối tượng miền đó và tất cả các đối tượng mà chúng tham chiếu lần lượt, v.v. Tải lười biếng xuất hiện trong tâm trí, điều đó có nghĩa là bạn bắt đầu truy vấn các đối tượng miền của mình, đây là trách nhiệm của kho lưu trữ ở nơi đầu tiên.
Do vấn đề này, cách tải "đối tượng" chính xác dường như có chức năng tải chuyên dụng cho từng trường hợp sử dụng. Các chức năng chuyên dụng này sau đó sẽ chỉ tải dữ liệu theo yêu cầu của trường hợp sử dụng mà chúng được thiết kế cho. Đây là nơi mà sự lúng túng xuất hiện: Đầu tiên, tôi sẽ phải duy trì một lượng đáng kể các hàm tải cho mỗi lần triển khai kho lưu trữ và các đối tượng miền sẽ kết thúc ở trạng thái không hoàn chỉnh mang null
trong các trường của chúng. Cái sau về mặt kỹ thuật không phải là một vấn đề bởi vì nếu một giá trị không được tải, thì nó không được yêu cầu bởi chức năng đã yêu cầu nó. Vẫn còn lúng túng và là một mối nguy hiểm tiềm tàng.
Quảng cáo 3.:
Làm thế nào một đối tượng miền sẽ xác minh các ràng buộc duy nhất khi xây dựng nếu nó không có bất kỳ khái niệm nào về kho lưu trữ? Chẳng hạn, nếu tôi muốn tạo một cái mới User
với số an sinh xã hội duy nhất (được đưa ra), xung đột sớm nhất sẽ xảy ra khi yêu cầu kho lưu trữ đối tượng, chỉ khi có một ràng buộc duy nhất được xác định trên cơ sở dữ liệu. Mặt khác, tôi có thể tìm kiếm một User
với an sinh xã hội nhất định và báo cáo lỗi trong trường hợp nó tồn tại, trước khi tạo một cái mới. Nhưng sau đó, kiểm tra ràng buộc sẽ sống trong dịch vụ chứ không phải trong đối tượng miền nơi chúng thuộc về. Tôi chỉ nhận ra rằng các đối tượng miền được phép sử dụng (kho chứa) rất tốt để xác nhận.
Quảng cáo 5.:
Tôi nhận thấy việc ánh xạ các đối tượng miền vào một phụ trợ lưu trữ như là một quá trình đòi hỏi nhiều công việc so với việc các đối tượng miền sửa đổi trực tiếp dữ liệu lót. Tất nhiên, đó là một điều kiện tiên quyết thiết yếu để tách rời việc thực hiện lưu trữ cụ thể khỏi mã miền. Tuy nhiên, nó thực sự đến với chi phí cao như vậy?
Bạn rõ ràng có tùy chọn sử dụng các công cụ ORM để thực hiện ánh xạ cho bạn. Tuy nhiên, những điều này thường yêu cầu bạn thiết kế mô hình miền theo các hạn chế của ORM, hoặc thậm chí giới thiệu một sự phụ thuộc từ miền đến lớp cơ sở hạ tầng (ví dụ bằng cách sử dụng các chú thích ORM trong các đối tượng miền). Ngoài ra, tôi đã đọc rằng các ORM giới thiệu một chi phí tính toán đáng kể.
Trong trường hợp cơ sở dữ liệu NoQuery, hầu như không tồn tại bất kỳ khái niệm giống ORM nào, làm thế nào để bạn theo dõi các thuộc tính nào đã thay đổi trong các mô hình miền trên save()
?
Chỉnh sửa : Ngoài ra, để kho lưu trữ truy cập trạng thái của đối tượng miền (tức là giá trị của từng trường), đối tượng miền cần tiết lộ trạng thái bên trong của nó phá vỡ đóng gói.
Nói chung:
- Logic giao dịch sẽ đi về đâu? Điều này chắc chắn là kiên trì cụ thể. Một số cơ sở hạ tầng lưu trữ thậm chí có thể không hỗ trợ các giao dịch (như kho lưu trữ giả trong bộ nhớ).
- Đối với các hoạt động hàng loạt sửa đổi nhiều đối tượng, tôi có phải tải, sửa đổi và lưu trữ từng đối tượng riêng lẻ để đi qua logic xác thực được đóng gói của đối tượng không? Điều đó trái ngược với việc thực hiện một truy vấn trực tiếp trên cơ sở dữ liệu.
Tôi sẽ đánh giá cao một số làm rõ về chủ đề này. Những giả định của tôi có đúng không? Nếu không, cách chính xác để giải quyết những vấn đề này là gì?