Bối cảnh:
Tôi đang thiết kế một ứng dụng máy chủ và tạo các dll riêng cho các hệ thống con khác nhau. Để đơn giản hóa mọi thứ, giả sử tôi có hai hệ thống con: 1) Users
2)Projects
Giao diện công cộng của người dùng có một phương pháp như:
IEnumerable<User> GetUser(int id);
Và giao diện công cộng của dự án có một phương pháp như:
IEnumerable<User> GetProjectUsers(int projectId);
Vì vậy, ví dụ, khi chúng ta cần hiển thị người dùng cho một dự án nhất định, chúng ta có thể gọi GetProjectUsers
và điều đó sẽ trả lại các đối tượng có đủ thông tin để hiển thị trong một datagrid hoặc tương tự.
Vấn đề:
Lý tưởng nhất là Projects
hệ thống con cũng không nên lưu trữ thông tin người dùng và nó chỉ nên lưu Id của người dùng tham gia dự án. Để phục vụ công tác GetProjectUsers
, nó cần phải gọi GetUser
của Users
hệ thống cho mỗi id người dùng được lưu trong cơ sở dữ liệu riêng của mình. Tuy nhiên, điều này đòi hỏi rất nhiều GetUser
cuộc gọi riêng biệt , gây ra rất nhiều truy vấn sql riêng bên trong User
hệ thống con. Tôi chưa thực sự thử nghiệm điều này nhưng việc có thiết kế trò chuyện này sẽ ảnh hưởng đến khả năng mở rộng của hệ thống.
Nếu tôi đặt sự tách biệt của các hệ thống con sang một bên, tôi có thể lưu trữ tất cả thông tin trong một lược đồ duy nhất có thể truy cập được bởi cả hai hệ thống và Projects
có thể chỉ cần thực hiện JOIN
để có được tất cả người dùng dự án trong một truy vấn duy nhất. Projects
cũng cần biết cách tạo User
đối tượng từ kết quả truy vấn. Nhưng điều này phá vỡ sự tách biệt có nhiều lợi thế.
Câu hỏi:
Bất cứ ai cũng có thể đề xuất một cách để giữ sự tách biệt trong khi tránh tất cả các GetUser
cuộc gọi cá nhân này trong thời gian GetProjectUsers
?
Ví dụ: một ý tưởng tôi có là Người dùng cung cấp cho các hệ thống bên ngoài khả năng "gắn thẻ" người dùng bằng cặp giá trị nhãn và yêu cầu người dùng có một giá trị nhất định, ví dụ:
void AddUserTag(int userId, string tag, string value);
IEnumerable<User> GetUsersByTag(string tag, string value);
Sau đó, hệ thống Dự án có thể gắn thẻ cho từng người dùng khi họ được thêm vào dự án:
AddUserTag(userId,"project id", myProjectId.ToString());
và trong GetProjectUsers, nó có thể yêu cầu tất cả người dùng dự án trong một cuộc gọi:
var projectUsers = usersService.GetUsersByTag("project id", myProjectId.ToString());
Phần tôi không chắc chắn về điều này là: có, Người dùng không biết về các dự án nhưng thực sự thông tin về tư cách thành viên dự án được lưu trữ trong hệ thống Người dùng, không phải Dự án. Tôi chỉ không cảm thấy tự nhiên nên tôi đang cố xác định xem có bất lợi lớn nào ở đây không.