【问题标题】:MVC - Dynamic binding to multiple databases using Ninject?MVC - 使用 Ninject 动态绑定到多个数据库?
【发布时间】:2011-11-02 19:17:21
【问题描述】:

我有一个连接到单个 MYSQL 数据库的小型 MVC 应用程序。我使用 Ninject 设置它以在应用程序启动期间绑定 connectionString。代码如下所示:

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 的新手,所以任何示例都将不胜感激!

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

【问题讨论】:

    标签: asp.net-mvc dependency-injection ninject dynamic-binding


    【解决方案1】:

    我可能会将存储库绑定到Ninject.Activation.IProvider,然后创建您自己的提供程序,从会话中提取连接字符串

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

    那么……

    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
    }
    

    【讨论】:

    • 所以在上面的这个例子中,绑定到 SessionConnectionProvider 在开始时不会返回任何内容,因为在用户登录之前不会设置会话变量。这仍然有效吗?换句话说,“Bind().ToProvider();”为用户访问的每个页面执行代码?抱歉 - 我还是 Ninject 和 DI 的大新手,并努力理解这些概念。谢谢!
    • Bind() 只在应用启动时执行一次,它只是创建绑定(Ninject 的配置)。一旦应用程序运行并请求页面,Ninject 将在任何时候请求 IRiskRepository 时执行提供程序。如果未经身份验证的页面不要求它,它不会尝试创建它。您可能需要添加检查以确保会话具有连接字符串,如果没有则抛出异常。
    猜你喜欢
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    相关资源
    最近更新 更多