2011-05-09 30 views
0

我正在尋找一種方法來從使用Unity IoC容器的MVC Web應用程序動態地切換設置。ASP.NET MVC和IoC動態切換配置設置

我這是在Global.asax.cs

private static IUnityContainer _container; 

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    RegisterRoutes(RouteTable.Routes); 
    InitializeUnityContainer(); 
} 

配置容器的靜態實例,然後自定義控制器工廠

protected override IController GetControllerInstance(
         RequestContext reqContext, Type controllerType) 
{ 
    // ... (some argument checking here) 

    return _container.Resolve(controllerType) as IController;   
} 

我們公司誰所有使用自己的數據庫中不同的團隊服務器(具有相同的模式)。管理員提出的解決方案是讓多個Web應用程序實例運行,因此您可以選擇適用於特定團隊的任何URL。我寧願只運行一個Web應用程序,讓團隊選擇他們希望應用程序連接的數據庫(以及其他配置設置)(理想情況下通過下拉菜單或某種類型的菜單)。

我有點難以忍受,但我怎麼能實現這個目標。統一容器需要爲每個團隊配置不同(也許我需要多個靜態實例?),並且需要更改控制器中直接訪問的其他配置設置。我想這應該是一個相對普遍的問題,是否有標準的解決方案?

+0

可能的重複:http://stackoverflow.com/questions/1900415/what-is-the-best-way-to-dynamic-load-connection-strings – 2011-05-09 12:51:09

+0

@標記我不認爲這是一個重複的所有。我的問題,據我瞭解,使用DI意味着我的所有連接字符串都固定在application_start上。我如何/在哪裏可以查字典/用戶團隊或其他? Unity正在從對象根注入我的連接字符串。 – fearofawhackplanet 2011-05-09 13:12:55

+0

您需要將運行時值映射到依賴項:http://stackoverflow.com/questions/1943576/is-there-a-pattern-for-initializing-objects-created-via-a-di-container/ 1945023#1945023 – 2011-05-09 13:18:49

回答

1

我不認爲託管所有團隊在一個單一的應用程序將運作良好 - 任何你有那不是請求範圍將無法正常工作 - 例如。任何應用程序範圍的數據或靜態字段都可能會導致問題,僅由第一個訪問者設置,或不斷重寫。

最清潔的方式肯定會有多個應用程序(即使它們指向相同的代碼庫)。

+0

我沒有想到這,這將是一個很好的解決方案。這是如何實現的?所以我想要共享所有我的DLL,視圖,JS和CSS等文件,但使用不同的配置文件(可能還有其他不同的CSS文件)。那可能嗎? – fearofawhackplanet 2011-05-11 10:57:38

+0

在IIS中,您可以將多個應用程序/網站指向同一個文件夾。加載不同的配置可能會更棘手,如果它在Web.config中 - 不確定是否可以根據主機頭從另一個文件加載它(如果不是,則可能需要將配置封裝起來,因此訪問它可以檢查主機頭) – 2011-05-11 11:51:36