0

我們正在開發一個多租戶ASP.NET MVC Web應用程序。每個租戶都有自己的數據庫。數據訪問由實體框架管理。 StructureMap被用作IoC容器。實體框架數據上下文已經用http請求範圍設置。對於每個請求,tenant都會被處理出來,並且StructureMap返回實體框架數據上下文和存儲庫類的新實例。StructureMap - 初始化多租戶Web應用程序上每個數據庫的實體框架

在Web應用程序的啓動類(IProcessHostPreloadClient的實現)中,我想初始化實體框架 - 我需要循環併爲每個配置的租戶創建一個新的datacontext實例。什麼是最好的方式去做這件事? StructureMap將返回與設置爲使用http/thread作用域緩存相同的數據上下文。

感謝, 戒

回答

1

如果你只是想根據租戶來改變連接字符串,下面應該工作:

For<Tenant>().Use(c => c.GetInstance<TenantFactory>().CreateTenant()); 
For<DbContext>().Use(c => new DbContext(
    ConfigurationManager.ConnectionStrings[c.GetInstance<Tenant>().ConnectionName] 
     .ConnectionString)); 

Tenant類應保持目前的租戶連接字符串名稱, TenantFactory會創建相應的Tenant,並解決用於確定連接字符串的任何方法。

如果這是一個更廣泛的變化,multi-container approach可能會更好。

+0

感謝您的回覆。我已經使用類似的方法獲取了正確的連接字符串。在IIS Web開始期間,我想爲每個租戶創建上下文。由於StructureMap被配置爲緩存每個請求/線程的上下文對象,它將在每次調用時返回相同的對象。什麼是建議的方法來讓StructureMap在啓動時僅爲每個租戶返回一個新實例? – HarshaP 2013-03-25 16:37:47

+0

您不應該緩存每個租戶的上下文。你想要按照HttpRequest緩存它。如果您對每個租戶進行緩存並在請求之間重複使用相同的上下文,那麼您將遇到併發問題。堅持在DbContext註冊中使用HttpContextScoped。 – PHeiberg 2013-03-25 20:52:15

+0

根據http請求緩存上下文 - 將爲每個請求創建一個新的請求。但是,我還想在開始時創建上下文對象以獲取實體框架的初始化,從而避免在第一次請求時發生此成本。我正在討論如何在內存中構建實體模型,以及由實體框架完成的檢查以檢查數據庫結構是否與模型匹配。 – HarshaP 2013-03-26 10:30:43

相關問題