Có khá nhiều cách để lột da mèo ở đây. Về cơ bản, tất cả chỉ tóm tắt ở mức bạn muốn áp dụng hình thức thuê nhà.
Kiến thức cơ bản
Cách tiếp cận cơ bản là ràng buộc một số loại khóa xác định khách hàng trên cơ sở mỗi chuỗi, để bạn có thể tìm hiểu về khách hàng mà chuỗi giao dịch thực thi hiện tại. Điều này thường đạt được bằng cách điền một ThreadLocal
với một số thông tin liên quan đến xác thực vì bạn thường có thể lấy được đối tượng thuê từ người dùng đã đăng nhập.
Bây giờ nếu đúng như vậy, có một số lựa chọn về nơi áp dụng kiến thức của người thuê. Hãy để tôi phác thảo ngắn gọn những điều phổ biến nhất:
Cho thuê nhiều lần ở cấp độ cơ sở dữ liệu
Một cách để tách dữ liệu cho nhiều khách hàng là có cơ sở dữ liệu riêng lẻ cho mỗi người thuê. Phần trừu tượng cốt lõi của Spring Data MongoDB cho điều này là MongoDBFactory
giao diện. Cách dễ nhất ở đây là ghi đè SimpleMongoDbFactory.getDb(String name)
và gọi phương thức cha với tên cơ sở dữ liệu, ví dụ:được làm giàu bằng tiền tố người thuê hoặc tương tự.
Cho thuê nhiều lần theo mức thu
Một tùy chọn khác là có các bộ sưu tập cụ thể của người thuê, ví dụ:thông qua các tiền tố trước hoặc sau của người thuê. Cơ chế này thực sự có thể được tận dụng bằng cách sử dụng ngôn ngữ Spring Expression (SpEl) trong @Document
collectionName
của chú thích thuộc tính. Đầu tiên, hãy hiển thị tiền tố đối tượng thuê thông qua một Spring bean:
@Component("tenantProvider")
public class TenantProvider {
public String getTenantId() {
// … implement ThreadLocal lookup here
}
}
Sau đó, sử dụng SpEL trong các loại miền của bạn @Document
ánh xạ:
@Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
public class Account { … }
SpEl cho phép bạn tham chiếu đến Spring bean theo tên và thực thi các phương thức trên chúng. MongoTemplate
(và do đó, sự trừu tượng hóa của kho lưu trữ được chuyển tiếp) sẽ sử dụng siêu dữ liệu ánh xạ của lớp tài liệu và hệ thống con ánh xạ sẽ đánh giá collectionName
để tìm hiểu về bộ sưu tập để tương tác.