我试图弄清楚如何在每个 Web 请求上设置不同的连接字符串。
这是我的场景:
- 一个基于 asp.net mvc 3 + ninject + 实体框架的 webapp
- 单一实体模型
- 具有相同模型的三个物理上不同的数据库
到目前为止,我尝试做的是通过覆盖基本控制器的 OnActionExecuting 方法来设置默认控制器工厂(传递正确的连接字符串)(每个控制器都继承自自定义基)但是如果我尝试使用两个应该同时访问不同数据库的不同用户不起作用。似乎第一个用户设置了他的连接字符串,第二个用户选择了已经设置的连接字符串,而没有设置新的默认控制器。
这是一些代码...
// 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 实现限制为单个请求。我是对还是错?