1

我有一个连接到单个MYSQL数据库的小MVC应用程序。我在Ninject中设置了在应用程序启动过程中绑定connectionString。该代码是这样的:MVC - 使用Ninject动态绑定到多个数据库?

的Global.asax.cs:

protected void Application_Start() 
{ 
... 
    ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory()); 
} 

NinjectControllerFactory.cs:

public class NinjectControllerFactory : DefaultControllerFactory 
{ 
... 
    private class EriskServices : NinjectModule 
    { 
     public override void Load() 
     { 
       // Bind all the Repositories 
       Bind<IRisksRepository>().To<MySql_RisksRepository>() 
        .WithConstructorArgument("connectionString", 
        ConfigurationManager.ConnectionStrings["dbcMain"] 
        .ConnectionString); 
     } 
    } 
} 

今天我的需求发生了变化,我必须现在支持多个数据库。我希望在web.config文件中定义每个数据库连接字符串,就像以前一样。用户在应用程序登录期间选择他们想要连接的数据库。

登录后绑定我的存储库最简单的方法是什么?我假设我需要在登录控制器中编写数据库绑定。

我是Ninject的新手,所以任何示例都将非常感谢!

一如既往,感谢您的时间和帮助! 。

回答

1

我可能会绑定仓库到Ninject.Activation.IProvider,然后创建自己的供应商,是直接从会议

Bind<IRisksRepository>().ToProvider<SessionConnectionProvider>(); 

那么的connectionString ...

在这个例子中
public class SessionConnectionProvider : Ninject.Activation.IProvider 
{ 
    #region IProvider Members 

    public object Create(Ninject.Activation.IContext context) 
    { 
     // use however you're accessing session here 
     var conStr = session.ConnectionString; 
     return new MySql_RisksRepository(conStr); 
    } 

    public Type Type 
    { 
     get { return typeof(IRisksRepository); } 
    } 

    #endregion 
} 
+0

所以上述情况,绑定到SessisionConnectionProvider将不会在开始时返回任何内容,因为会话变量不会在用户登录后才设置。请问这仍然有效吗? 换句话说,是否“绑定()。ToProvider ();”代码对用户访问的每个页面执行?对不起 - 我是Ninject和DI的新手,并努力让我的头脑对这些概念有所了解。谢谢! –

+0

Bind()仅在应用程序启动时执行一次,它仅创建Binding(Ninject的配置)。一旦应用程序运行,并且请求页面,Ninject会在任何时候执行提供程序IRiskRepository被请求。如果未经认证的页面不要求它,它将不会尝试创建它。你可能想要添加一个检查来确保会话有连接字符串,如果没有则抛出异常。 –