Hãy để tôi bắt đầu bằng cách xin lỗi đầu tiên về độ dài của bài đăng, nhưng tôi thực sự muốn truyền đạt chi tiết như trước để tôi không mất thời gian của bạn qua lại trong các bình luận.
Tôi đang thiết kế một ứng dụng theo cách tiếp cận DDD và đang tự hỏi tôi có thể làm theo hướng dẫn nào để xác định liệu Root tổng hợp có nên chứa AR khác hay không nếu chúng được để lại dưới dạng AR riêng biệt, "tự do".
Hãy xem trường hợp của ứng dụng Đồng hồ thời gian đơn giản cho phép Nhân viên tự đồng hồ vào hoặc ra trong ngày. Giao diện người dùng cho phép họ nhập ID nhân viên và mã PIN sau đó được xác thực và trạng thái hiện tại của nhân viên được truy xuất. Nếu nhân viên hiện đang có đồng hồ, giao diện người dùng sẽ hiển thị nút "Đồng hồ hết"; và ngược lại, nếu chúng không có đồng hồ, nút này ghi "Đồng hồ trong". Hành động được thực hiện bằng nút cũng tương ứng với trạng thái của nhân viên.
Ứng dụng này là một máy khách web gọi một máy chủ phụ được hiển thị thông qua giao diện dịch vụ RESTful. Lần đầu tiên tôi vượt qua trong việc tạo các URL trực quan, dễ đọc dẫn đến hai điểm cuối sau:
http://myhost/employees/{id}/clockin
http://myhost/employees/{id}/clockout
LƯU Ý: Chúng được sử dụng sau khi ID nhân viên và mã PIN đã được xác thực và "mã thông báo" đại diện cho "người dùng" được chuyển trong tiêu đề. Điều này là do có "chế độ người quản lý" cho phép người quản lý hoặc người giám sát đồng hồ vào hoặc ra một nhân viên khác. Nhưng, vì lợi ích của cuộc thảo luận này, tôi đang cố gắng làm cho nó đơn giản.
Trên máy chủ, tôi có ApplicationService cung cấp API. Ý tưởng ban đầu của tôi cho phương thức ClockIn là:
public void ClockIn(String id)
{
var employee = EmployeeRepository.FindById(id);
if (employee == null) throw SomeException();
employee.ClockIn();
EmployeeRepository.Save();
}
Điều này có vẻ khá đơn giản cho đến khi chúng tôi nhận ra rằng thông tin thẻ thời gian của Nhân viên thực sự được duy trì như một danh sách các giao dịch. Điều đó có nghĩa là mỗi lần tôi gọi ClockIn hoặc ClockOut, tôi không trực tiếp thay đổi trạng thái của Nhân viên mà thay vào đó, tôi đang thêm một mục mới vào TimeSheet của Nhân viên. Trạng thái hiện tại của Nhân viên (có trong hoặc không) được lấy từ mục nhập gần đây nhất trong TimeSheet.
Vì vậy, nếu tôi sử dụng mã được hiển thị ở trên, kho lưu trữ của tôi phải nhận ra rằng các thuộc tính bền vững của Nhân viên không thay đổi nhưng mục nhập mới đã được thêm vào TimeSheet của Nhân viên và thực hiện chèn vào kho lưu trữ dữ liệu.
Mặt khác (và đây là câu hỏi cuối cùng của bài đăng), TimeSheet có vẻ như đó là một Root tổng hợp cũng như nó có danh tính (ID nhân viên và thời gian) và tôi có thể dễ dàng thực hiện logic tương tự như TimeSheet.ClockIn (Mã hiệu công nhân).
Tôi thấy mình đang tranh luận về ưu điểm của hai cách tiếp cận và, như đã nêu trong đoạn mở đầu, tự hỏi tôi nên đánh giá tiêu chí nào để xác định cách tiếp cận nào phù hợp hơn cho vấn đề.