Тук има доста начини да одирате котката. По същество всичко се свежда до това на кое ниво искате да приложите наемането.
Основни положения
Основният подход е да се обвърже някакъв вид ключ, идентифициращ клиента на база на нишка, така че да можете да разберете за клиента, с който се занимава текущата нишка на изпълнение. Това обикновено се постига чрез попълване на ThreadLocal
с известна информация, свързана с удостоверяването, тъй като обикновено можете да извлечете наемателя от влезлия потребител.
Сега, ако това е на място, има няколко опции за това къде да приложите знанията на наемателя. Позволете ми накратко да очертая най-често срещаните:
Много наемане на ниво база данни
Един от начините за разделяне на данни за множество клиенти е да имате индивидуални бази данни за всеки наемател. Основната абстракция на Spring Data MongoDB за това е MongoDBFactory
интерфейс. Най-лесният начин тук е да замените SimpleMongoDbFactory.getDb(String name)
и извикайте родителския метод с името на базата данни, напр. обогатено с префикса на наемателя или други подобни.
Много наемане на ниво колекция
Друг вариант е да имате специфични за наемателя колекции, напр. чрез пре- или постфикси на наемател. Този механизъм всъщност може да бъде използван чрез използване на езика Spring Expression (SpEl) в @Document
collectionName
на анотацията атрибут. Първо, изложете префикса на наемателя чрез Spring bean:
@Component("tenantProvider")
public class TenantProvider {
public String getTenantId() {
// … implement ThreadLocal lookup here
}
}
След това използвайте SpEL във вашите домейни типове @Document
картографиране:
@Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
public class Account { … }
SpEl ви позволява да се позовавате на Spring bean по име и да изпълнявате методи върху тях. MongoTemplate
(и по този начин абстракцията на хранилището транзитивно) ще използва метаданните за картографиране на класа на документа и подсистемата за картографиране ще оцени collectionName
атрибут, за да разберете за колекцията, с която да взаимодействате.