我们目前正在开发基于 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}
这种连接到多个相同数据库的方法是否有效,还是为每个客户数据库构建一个 sessionfactory 是更好的做法?