【问题标题】:nHibernate, ASP.NET MVC, s#arp architecture and multiple identical databasesnHibernate、ASP.NET MVC、s#arp 架构和多个相同的数据库
【发布时间】:2010-11-03 15:07:35
【问题描述】:

我们目前正在开发基于 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。为此,我有两个问题:

  1. 我们如何从 url 中检索客户代码并将其放入每个请求的上下文对象中?当我们使用以下路线时?

    &lt;main-site-url&gt;/{customercode}/{controller}/{action}/{id}

  2. 这种连接多个相同数据库的方法是否有效,或者为每个客户数据库构建一个会话工厂是更好的做法?

【问题讨论】:

    标签: asp.net-mvc nhibernate s#arp-architecture multiple-databases


    【解决方案1】:

    为了获得customercode,您需要访问路线数据,类似于

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

    我的第二个建议是不要将此代码放在上面提供的 sn-p 中。把它抽象出来。请参阅Joshua's answer,它突出了我正在考虑的方法。

    对第二个问题真的帮不上忙,实际上对提到的两个框架都不熟悉。

    【讨论】:

    • 最初在答案中-据我所知,创建会话工厂是一项昂贵的操作,这可能会影响您的决定。现在还考虑到有多个数据库,并且还取决于每个数据库的预期命中量,这可能是一个关键因素。会话工厂是否具有缓存等在您的情况下可能有用的好处?这可能会有所帮助 - codeproject.com/KB/aspnet/NHibernateMultipleDBs.aspx
    • 缓存是我们将来可能需要的东西。但是,二级缓存是如何实现的呢?每个 SessionFactory 还是每个连接(字符串)?
    • @Rik - 抱歉,正如我所说,我对这两个框架都不太熟悉,也没有足够的实践经验
    【解决方案2】:

    请参阅我最近的博客文章,其中展示了如何使用子域连接到不同的数据库,尽管很容易实现您自己的 ITenantContext 版本,从请求 url 中获取客户代码。还为每个租户使用单独的会话工厂。

    http://www.yellowfeather.co.uk/2011/01/multi-tenancy-on-sharp-architecture/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多