現在、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つの質問があります:
URLから顧客コードを取得して、リクエストごとにコンテキストオブジェクトに配置するにはどうすればよいですか?次のルートを使用する場合はどうなりますか?
<main-site-url>/{customercode}/{controller}/{action}/{id}
複数の同一のデータベースに接続するこの方法は有効ですか、それとも顧客データベースごとにセッションファクトリを構築する方が良い方法ですか?