2013-12-10 95 views
0

我有一個多個應用程序,它具有多個數據庫,用於具有相同db結構的不同客戶。EF在同一類型的不同上下文之間切換

在實際應用中,用戶登錄時根據自己的客戶ID,我會知道他的客戶數據庫,並在他的登錄按鈕單擊事件我需要動態改變我的分貝範圍內的飛行連接字符串之後。

我正在使用EF 5.0和Autofac IOC容器。 我在這裏粘貼了我的代碼,這對我沒有幫助。

什麼是我可以管理的最佳方式?

 string EntityFrameworkConnectionString = null; 
     var builder = new ContainerBuilder(); 

     builder.Register(c => 
     { 
      if (string.IsNullOrEmpty(EntityFrameworkConnectionString)) 
      { 
       var profileProvider = c.Resolve<IConfigurationProfileProvider<CustomerProfile>>(); 
       var profile = profileProvider.GetProfile(); 
       EntityFrameworkConnectionString = profile.CustomerDatabaseConnectionString; 
      } 
      return new CustomerDataContext(EntityFrameworkConnectionString); 
     }) 
     .As<ICustomerDataContext>() 
     .As<IDbContext>() 
     .InstancePerDependency(); 

     builder.RegisterType<CustomerDataContextFactory>().As<ICustomerDataContextFactory>(); 

     var assembly = Assembly.GetExecutingAssembly(); 
     builder.RegisterAssemblyTypes(assembly) 
       .Where(t => t.Name.EndsWith("Repository")) 
       .AsImplementedInterfaces() 
       .InstancePerDependency(); 
+0

爲什麼在註冊委託之外留下EntityFrameworkConnectionString變量?由於關閉,這很糟糕。 –

回答

1

我是這樣做的:

  1. Introdu CE將管理連接字符串的接口:

    public interface IConnectionStringManager 
    { 
        string GetConnectionString(); 
    } 
    
  2. 與具有IConfigurationProfileProvider注入它的實現:

    public class ConnectionStringManager : IConnectionStringManager 
    { 
        private readonly IConfigurationProfileProvider<CustomerProfile> _configurationProfileProvider; 
    
        public ConnectionStringManager(IConfigurationProfileProvider<CustomerProfile> configurationProfileProvider) 
        { 
         _configurationProfileProvider = configurationProfileProvider; 
        } 
    
        public string GetConnectionString() 
        { 
         return _configurationProfileProvider.GetProfile().CustomerDatabaseConnectionString; 
        } 
    } 
    
  3. 然後注入到IConnectionStringManager和CustomerDataContext獲取連接字符串。

    public CustomerDataContext(IConnectionStringManager connectionStringManager) 
    { 
        var connectionString = connectionStringManager.GetConnectionString(); 
        // pass the connectionString to your context 
    } 
    
  4. 和註冊ConnectionStringManager和CustomerDataContext像往常一樣:

    builder.RegisterType<ConnectionStringManager>().As<IConnectionStringManager>(); 
    builder.RegisterType<CustomerDataContext>() 
        .As<ICustomerDataContext>() 
        .As<IDbContext>() 
        .InstancePerDependency(); 
    

BTW,看看在Autofac Multitenant Integration這可以緩解多租戶支持。

+0

謝謝亞歷山大!你能告訴我如何用一些代碼做第3步嗎? – rajcool111

+0

另外,在我的應用程序中,用戶根據他的客戶ID登錄後,我將知道他的客戶數據庫的連接字符串。那麼,我需要在登錄按鈕點擊事件之後執行這4個步驟嗎?並會動態地動態改變我的數據庫環境? – rajcool111

+0

@ rajcool111關於步驟3,這取決於你的CustomerDataContext實現。我會去與構造函數注入,像 「公共CustomerDataContext(IConnectionStringManager connectionStringManager){VAR的connectionString = connectionStringManager.GetConnectionString();}」。我也更新了答案。 –

0

我真的不認爲你需要用你的國際奧委會這種情況下(特別是考慮到你是如何複雜使得它)。爲什麼不只是存儲連接字符串作爲一個靜態變量,然後重寫你的DbContext的構造函數總是使用變量?

像這樣:

連接字符串:

public static class StaticVariables 
{ 
    public static string ConnectionString { get; set; } 
} 

爲了您DbContext構造:

public DbContext() 
{ 
    this(StaticVariables.ConnectionString); 
} 
+1

這將是一個併發環境中的災難。 –

相關問題