C#学习教程:在ASP.NETMVC3WebApp+Ninject+EF中为不同的用户设置不同的连接字符串弄清楚如何在每个Web请求上设置不同的连接字符串。这是我的场景:到目前为止我尝试过的是通过覆盖基本控制器的OnActionExecuting方法(每个控制器继承自自定义基础)来设置默认控制器工厂(传递正确的连接字符串)但是如果我尝试访问两个不同的用户谁应该同时访问不同的数据库是行不通的。似乎第一个用户设置了他的连接字符串,第二个用户选择了已经设置的连接字符串而没有设置新的默认控制器。这是一些代码……//BasecontrollerpublicclassBaseController:Controller{protectedoverridevoidOnActionExecuting(ActionExecutingContextfilterContext){vardatabase=String.Empty;switch(Request.Url.Host){case"aaa.domain.local":database="AAA";休息;case"bbb.domain.local":database="BBB";休息;case"ccc.domain.local":database="CCC";休息;}ControllerBuilder.Current.SetControllerFactory(newNinjectControllerFactory(WebConfigurationManager.ConnectionStrings[database].ConnectionString));}}//Ninject控制器工厂publicclassNinjectControllerFactory:DefaultControllerFactory{privateIKernel_kernel;publicNinjectControllerFactory(){}publicNinjectControllerFactory(stringconnectionString){_kernel=newStandardKernel(newABCServices(connectionString));}protectedoverrideIControllerGetControllerInstance(System.Web.Routing.RequestContextrequestContext,TypecontrollerType){if(controllerType==空)返回空;返回(IController)_kernel.Get(控制器类型);}私有类ABCServices:NinjectModule{私有字符串_connectionString;publicABCServices(stringconnectionString){_connectionString=connectionString;}publicoverridevoidLoad(){Bind().To().InRequestScope().WithConstructorArgument("connectionString",_connectionString);如您所见,我正在使用.InRequestScope()将ninject实现限制为单个请求我是对还是错?解决方案是不直接注入连接字符串,而是注入某种类型的IConnectionFactory并将开关(Request.Url.Host)代码移至工厂实现。这简化了您的注册并消除了实现ControllerBase的需要。您的问题与我刚刚回答的问题相似。更新实现这一点的方法取决于您的应用程序、它的设计和要求,但您可以在应用程序的核心层定义以下IConnectionFactory:publicinterfaceIConnectionFactory{SqlConnectionOpenConnection();}由于数据库的选择特定于ASP。NET,因此您必须在MVC项目中定义此接口的实现。它可能看起来像这样:varconnection=newSqlConnection(connStr);connection.Open();返回连接;}//这是您的OnActionExecuting方法中的旧代码。私有静态字符串GetConnectionString(){vardatabase=String.Empty;开关(HttpContext.Current.Request.Url.Host){case"aaa.domain.local":database="AAA";休息;case"bbb.domain.local":database="BBB";休息;case"ccc.domain.local":database="CCC";休息;}返回WebConfigurationManager.ConnectionStrings[数据库].ConnectionString;你可以像这样按Register:kernel.Bind().To();您的SqlUsersRepository(和所有其他服务)现在可以依赖IConnectionFactory而不是字符串。这样您的服务就不知道如何为自己创建连接,并且您已经将其抽象掉了。这使得以后重构和更改代码变得更加容易。您甚至可能想更进一步,将DbContext或IDbContextFactory注入您的存储库。以上就是C#学习教程:在ASP.NETMVC3WebApp+Ninject+EF中为不同的用户设置不同的连接字符串。请注意——本文摘自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
