Istnieje kilka sposobów na oskórowanie kota. Zasadniczo wszystko sprowadza się do tego, na jakim poziomie chcesz zastosować najem.
Podstawy
Podstawowym podejściem jest powiązanie pewnego rodzaju klucza identyfikującego klienta na podstawie wątku, dzięki czemu można dowiedzieć się o kliencie, z którym ma do czynienia aktualny wątek realizacji. Zwykle osiąga się to poprzez wypełnienie ThreadLocal
z pewnymi informacjami związanymi z uwierzytelnianiem, ponieważ zwykle można uzyskać najemcę od zalogowanego użytkownika.
Teraz, jeśli tak jest, istnieje kilka możliwości zastosowania wiedzy najemcy. Pozwolę sobie krótko opisać najczęstsze z nich:
Multi-tenancy na poziomie bazy danych
Jednym ze sposobów oddzielenia danych dla wielu klientów jest posiadanie indywidualnych baz danych na dzierżawcę. Podstawową abstrakcją Spring Data MongoDB do tego jest MongoDBFactory
berło. Najprostszym sposobem jest nadpisanie SimpleMongoDbFactory.getDb(String name)
i wywołaj metodę nadrzędną z nazwą bazy danych np. wzbogacony o prefiks najemcy lub podobny.
Wielu najemców na poziomie kolekcji
Inną opcją jest posiadanie kolekcji specyficznych dla najemców, np. za pomocą prefiksów lub postfixów najemcy. Ten mechanizm może być faktycznie wykorzystany przy użyciu języka Spring Expression (SpEl) w @Document
collectionName
adnotacji atrybut. Najpierw wyeksponuj prefiks najemcy za pomocą fasoli Spring:
@Component("tenantProvider")
public class TenantProvider {
public String getTenantId() {
// … implement ThreadLocal lookup here
}
}
Następnie użyj SpEL w swojej domenie typu @Document
mapowanie:
@Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
public class Account { … }
SpEl pozwala odwoływać się do Spring beans po nazwie i wykonywać na nich metody. MongoTemplate
(a tym samym abstrakcja repozytorium przechodnie) użyje metadanych mapowania klasy dokumentu, a podsystem mapowania oceni collectionName
atrybut, aby dowiedzieć się o kolekcji do interakcji.