我們目前正在開發基於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