#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, чтобы последующие запросы использовали эти предварительно инициализированные клиенты для доступа.