Er zijn nogal wat manieren om de kat hier te villen. Het komt er in wezen allemaal op neer op welk niveau u de huurovereenkomst wilt toepassen.
Basis
De basisbenadering is om een soort sleutel te binden die de klant per thread identificeert, zodat u meer te weten kunt komen over de klant waarmee de huidige uitvoeringsdraad te maken heeft. Dit wordt meestal bereikt door het invullen van een ThreadLocal
met enige authenticatie-gerelateerde informatie, aangezien u de huurder gewoonlijk kunt afleiden van de ingelogde gebruiker.
Als dat op zijn plaats is, zijn er een paar opties voor het toepassen van de kennis van de huurder. Laat me de meest voorkomende kort schetsen:
Multi-tenancy op databaseniveau
Een manier om gegevens voor meerdere clients te scheiden, is door afzonderlijke databases per Tenant te hebben. Spring Data MongoDB's kernabstractie hiervoor is de MongoDBFactory
koppel. De gemakkelijkste manier is om SimpleMongoDbFactory.getDb(String name)
te overschrijven en roep de bovenliggende methode aan met de databasenaam, b.v. verrijkt met het voorvoegsel van de huurder of iets dergelijks.
Multi-tenancy op collectieniveau
Een andere optie is om huurderspecifieke incasso's te hebben, b.v. door huurder pre- of postfixes. Dit mechanisme kan daadwerkelijk worden benut door de Spring Expression-taal (SpEl) te gebruiken in het @Document
annotatie's collectionName
attribuut. Stel eerst het voorvoegsel van de huurder bloot via een lenteboon:
@Component("tenantProvider")
public class TenantProvider {
public String getTenantId() {
// … implement ThreadLocal lookup here
}
}
Gebruik dan SpEL in uw domeintypes @Document
in kaart brengen:
@Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
public class Account { … }
Met SpEl kunt u bij naam verwijzen naar lentebonen en er methoden op uitvoeren. MongoTemplate
(en dus de repository-abstractie transitief) zal de mapping-metadata van de documentklasse gebruiken en het mapping-subsysteem zal de collectionName
evalueren attribuut om meer te weten te komen over de collectie om mee te werken.