7

我们目前正在开发基于 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 中检索客户代码并将其放入每个请求的上下文对象中?当我们使用以下路线时?

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

  2. 这种连接到多个相同数据库的方法是否有效,还是为每个客户数据库构建一个 sessionfactory 是更好的做法?

4

2 回答 2

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 的回答,它突出了我正在考虑的方法。

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

于 2010-11-09T12:14:54.190 回答
1

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

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

于 2011-01-12T23:05:13.923 回答