В настоящее время мы разрабатываем приложение на основе NHibernate и ASP.NET MVC и серверной части SQL Server. Поскольку я довольно новичок в NHibernate, я пытаюсь понять лучшие практики.
Наше приложение требует, чтобы у каждого пользователя была своя собственная база данных SQL Server. Все эти базы данных имеют одинаковую структуру.
Наши клиенты идентифицируются по коду клиента, например, 1500.
Мы создали собственного провайдера соединений для nHibernate, который мы уже используем в наших внутренних службах nServiceBus:
public class DynamicConnectionProvider : DriverConnectionProvider
{
public override IDbConnection GetConnection()
{
IDbConnection conn = Driver.CreateConnection();
try
{
var messageExecutionContext = ServiceLocator.Current.GetInstance<ITTTContextProvider>().CurrentContext;
if (messageExecutionContext.CustomerId == 0)
{
conn.ConnectionString = ConfigurationManager.ConnectionStrings["dev"]
.ConnectionString;
}
else
{
conn.ConnectionString = ConfigurationManager.ConnectionStrings["default"]
.ConnectionString
.FormatWith(messageExecutionContext.CustomerId);
}
conn.Open();
}
catch (Exception)
{
conn.Dispose();
throw;
}
return conn;
}
}
Этот провайдер соединений проверяет код клиента в объекте контекста и соответственно устанавливает строку соединения.
Мы планируем предоставить HttpContext с поддержкой ITTTContextProvider
. Для этого у меня есть два вопроса:
Как мы можем извлечь код клиента из URL и поместить его в наш контекстный объект для каждого запроса? когда мы используем следующий маршрут?
<main-site-url>/{customercode}/{controller}/{action}/{id}
Допустим ли этот метод подключения к нескольким идентичным базам данных или лучше создать сессионную базу данных foreach customer?