7

我們目前正在開發基於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。爲此,我有兩個問題:

  1. 我們怎樣才能從URL取得客戶代碼,並把它變成我們的上下文對象爲每個請求?當我們使用以下路線?

    <main-site-url>/{customercode}/{controller}/{action}/{id}

  2. 是連接到幾個相同的數據庫,這種方法有效的或者是更好的做法來構建一個SessionFactory的foreach客戶數據庫?

回答

1

爲了獲得customercode您需要訪問路由數據,沿

HttpContextBase currentContext = new HttpContextWrapper(HttpContext.Current); //ServiceLocator.Current.GetInstance<ITTTContextProvider>().CurrentContext; 
RouteData routeData = RouteTable.Routes.GetRouteData(currentContext); 
var cusomterCode = routeData.Values["customercode"] 

我的第二個建議線的東西會不會把這個代碼中提供的上述片段。摘掉它。請參閱Joshua's answer,其中突出了我正在考慮的方法。

不能真正幫助第二個問題,實際上並不熟悉這兩個提到的框架。

+1

最初的答案 - 從我記得一個創建會話工廠是一個昂貴的操作是可能的東西,將計算入你的決定。現在也考慮有多個數據庫,並且還取決於每個數據庫的預期命中數量,這可能是一個關鍵因素。會議工廠是否有緩存等好處,這可能對您的情況有用?這可能會有所幫助 - http://www.codeproject.com/KB/aspnet/NHibernateMultipleDBs.aspx – Ahmad 2010-11-09 12:18:00

+0

緩存是我們將來可能需要的東西。但是,如何實現二級緩存?每個SessionFactory或每個連接(字符串)? – Rik 2010-11-11 10:03:30

+0

@Rik - 對不起,正如我所說我不太熟悉,沒有足夠的經驗與任何框架 – Ahmad 2010-11-11 10:13:47