7

現在、NHibernateとASP.NETMVCおよびSQLServerバックエンドに基づくアプリケーションを開発しています。私はNHibernateにかなり慣れていないので、ベストプラクティスを理解しようとしています。

このアプリケーションでは、すべてのユーザーが独自のSQLServerデータベースを持っている必要があります。これらのデータベースはすべて同じ構造です。

私たちの顧客は、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。このために私は2つの質問があります:

  1. URLから顧客コードを取得して、リクエストごとにコンテキストオブジェクトに配置するにはどうすればよいですか?次のルートを使用する場合はどうなりますか?

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

  2. 複数の同一のデータベースに接続するこの方法は有効ですか、それとも顧客データベースごとにセッションファクトリを構築する方が良い方法ですか?

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"]

私の2番目の提案は、提供された上記のスニペットにこのコードを入れないことです。それを抽象化します。私が考えているアプローチを強調するジョシュアの答えを参照してください。

2番目の質問については、実際には両方のフレームワークに精通していないため、実際には役に立ちません。

于 2010-11-09T12:14:54.190 に答える
1

サブドメインを使用してさまざまなデータベースに接続する方法を示す最近のブログ投稿を参照してください。ただし、リクエストURLから顧客コードを取得した独自のバージョンのITenantContextを実装するのは簡単です。また、テナントごとに個別のセッションファクトリを使用します。

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

于 2011-01-12T23:05:13.923 に答える