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被請求。如果未經認證的頁面不要求它,它將不會嘗試創建它。你可能想要添加一個檢查來確保會話有連接字符串,如果沒有則拋出異常。 –