Web 要求ごとに異なる接続文字列を設定する方法を見つけようとしています。
これは私のシナリオです:
- asp.net mvc 3 + ninject + エンティティ フレームワークに基づく 1 つの Web アプリケーション
- 1 つのエンティティ モデル
- 同じモデルで物理的に異なる 3 つのデータベース
これまでに試みたのは、ベース コントローラーの OnActionExecuting メソッドをオーバーライドすることで (正しい接続文字列を渡して) デフォルトのコントローラー ファクトリを設定することです (すべてのコントローラーはカスタム ベースから継承されます)。異なるデータベースに同時にアクセスする必要がある異なるユーザーは機能しません。最初のユーザーが接続文字列を設定し、2 番目のユーザーが新しい既定のコントローラーを設定せずに既に設定されているものを選択したようです。
ここにいくつかのコードがあります...
// Base controller
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var database = String.Empty;
switch (Request.Url.Host)
{
case "aaa.domain.local":
database = "AAA";
break;
case "bbb.domain.local":
database = "BBB";
break;
case "ccc.domain.local":
database = "CCC";
break;
}
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory(WebConfigurationManager.ConnectionStrings[database].ConnectionString));
}
}
// Ninject controller factory
public class NinjectControllerFactory : DefaultControllerFactory
{
private IKernel _kernel;
public NinjectControllerFactory()
{
}
public NinjectControllerFactory(string connectionString)
{
_kernel = new StandardKernel(new ABCServices(connectionString));
}
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
return null;
return (IController)_kernel.Get(controllerType);
}
private class ABCServices : NinjectModule
{
private string _connectionString;
public ABCServices(string connectionString)
{
_connectionString = connectionString;
}
public override void Load()
{
Bind<IUsersRepository>().
To<SqlUsersRepository>().
InRequestScope().
WithConstructorArgument("connectionString", _connectionString);
}
}
}
ご覧のとおり、.InRequestScope() を使用して、ninject の実装を単一の要求に制限しています。私は正しいですか?