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