我们目前正在开发基于NHibernate和ASP.NET MVC以及SQL Server后端的应用程序。由于我对NHibernate相当陌生,因此我试图了解最佳实践。nHibernate,ASP.NET MVC,s#arp体系结构和多个相同的数据库
我们的应用程序要求每个用户拥有自己的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的foreach客户数据库?
最初的答案 - 从我记得一个创建会话工厂是一个昂贵的操作是可能的东西,将计算入你的决定。现在也考虑有多个数据库,并且还取决于每个数据库的预期命中数量,这可能是一个关键因素。会议工厂是否有缓存等好处,这可能对您的情况有用?这可能会有所帮助 - http://www.codeproject.com/KB/aspnet/NHibernateMultipleDBs.aspx – Ahmad 2010-11-09 12:18:00
缓存是我们将来可能需要的东西。但是,如何实现二级缓存?每个SessionFactory或每个连接(字符串)? – Rik 2010-11-11 10:03:30
@Rik - 对不起,正如我所说我不太熟悉,没有足够的经验与任何框架 – Ahmad 2010-11-11 10:13:47