Мультитенант Mongodb в проекте .NET core

#mongodb #asp.net-core #multi-tenant

#mongodb #asp.net-core #мультитенант

Вопрос:

Я использую .NET Core и MongoDB. В настоящее время это проект с одной базой данных. Теперь я хочу внедрить многопользовательский режим в свой проект. Это отдельная база данных для разных пользователей. Когда пользователь входит на сайт и, основываясь на данных этого пользователя, хочет выбрать строку подключения.

https://web.archive.org/web/20140812091703/

http://support.mongohq.com/use-cases/multi-tenant.html

https://gunnarpeipman.com/aspnet/tenant-providers/

Но проблема в том, что я понятия не имею, как реализовать это в моем существующем коде?

Мой существующий код

 public MetaphorsContext(IMongoClient client,
                        IMongoDatabase database)
{
  _client = client;
  _database = database;
}

public IMongoCollection<Location> Locations
{
  get ???
}
  

Ответ №1:

Если ваш подход включает разные базы данных в одном кластере, то вам не нужны разные строки подключения, а просто словарь, который сопоставляет идентификатор каждого клиента с соответствующим MongoDatabase :

 public IDictionary<string, IMongoDatabase> Databases = ...

string tenantID = ...

Databases.TryGetValue(tenantID, out var database);

// use database to get collections
  

Если разные базы данных хранятся в разных кластерах, то у вас может быть словарь, который сопоставляет идентификатор каждого клиента с соответствующим ему MongoClient .

 public IDictionary<string, IMongoClient> Clients = ...

string tenantID = ...

Clients.TryGetValue(tenantID, out var client);

// use client's databases and their collections
  

Комментарии:

1. не могли бы вы, пожалуйста, предоставить более подробную информацию?

2. Какие подробности вам еще требуются?

3. У меня есть основная база данных под названием «TenantManagement», затем, когда пользователь входит в систему, проверьте имя арендатора в этой базе данных. Итак, мы получаем строку подключения и используем эту строку подключения для этого конкретного пользователя. Возможно ли это сделать таким образом? У каждого пользователя своя база данных.

4. В какой-то момент вам придется кэшировать клиенты / базы данных ваших пользователей (на случай, если у вас разные базы данных для пользователей), и вот тут-то словарь и поможет. То, как этот словарь загружается / инициализируется, зависит от ваших требований к варианту использования. Если, например, пользователей немного, вы можете загрузить все строки подключения во время запуска и инициализировать клиенты MongoDB, чтобы последующие запросы использовали эти предварительно инициализированные клиенты для доступа.