В настоящее время мы разрабатываем приложение на основе 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-адреса и поместить его в наш объект контекста для каждого запроса? когда мы используем следующий маршрут?
Действителен ли этот метод подключения к нескольким идентичным базам данных или лучше Практика создания клиентской базы данных sessionfactory для каждого клиента?