2013-10-08 42 views
1

第一次問一個問題,很長時間的讀者。MEF,實體框架和構造函數注入

我們有一個新的應用程序,大量使用MEF和DI(通過構造函數參數注入)來處理對象實例化。我們正在努力的一個領域是創建EF上下文。要創建EF上下文,您需要一個conn字符串(例如,在app.config中)。但是我們的應用程序讓我們的用戶在啓動時提供服務器/數據庫(以及用戶名/密碼)。所以問題是我們如何使用MEF來使用默認的conn字符串實例化EF上下文,然後用用戶提供的值替換登錄後的conn字符串,然後在MEF容器中更新它?

我們目前處理它的唯一方法是在LoginViewModel中使用IoC.Get類型調用來將現有實體對象拉出容器,然後使用新值設置其連接字符串。然後MEF使用這個新字符串向前移動,並在我們將其注入應用程序時自動創建/配置上下文。

關注的是服務定位器的氣味(發生在組合根之外)以及其他問題,如MEF + DI +容器使用。許多評論者指出,盲目堅持一種模式是一種災難。問題是如果這是處理這種情況的適當方式?我們是否應該使用創建的抽象工廠,然後使用它來創建上下文?

如何在應用程序的引導部分中創建上下文時替換EF的連接字符串,並因此在登錄時提供新的conn字符串時已經實例化? MEF通常會重複創建/處理上下文 - 那麼如何設置新的連接字符串?我們使用共享策略創建上下文部分,理論上只有一個並且從不銷燬,因此只需更新連接字符串就可以工作。

回答

1

我們面對我們的多租戶MVC Azure的基於應用程序類似的情況,我們通過解決導出方法來獲取用戶的活動會話當前連接字符串請求的數據庫操作

導出方法從MVC會話詳細信息中抽取DbContext,只需在DbContext或IRepository實現中導入導出的方法。

不要使用屬性導出,當屬性導出時,其值由MEF保存並且不會獲取存儲在活動會話中的當前值。方法導出將使您能夠獲取存儲在活動會話中的連接字符串的當前值。

讓我知道,如果你需要進一步澄清。