2014-02-19 90 views
0

所以我有多個db實例和一個web應用程序。 取決於url名稱,我知道我需要與哪個db實例交談。 我想更改舊的醜陋的DAL與nhibernate一起使用,我想用DI來做到這一點。 這樣,讓說我有這個類:使用nHibernate與DI數據庫實例

class CompanyDal(ISession session) //nhibernate session 
{ 
    Save(ICompany company) 
    { 
     session.Save(company) 
    } 
} 

因此創建了DAL對象時我注入Hibernate的Session。但是我的IOC需要知道注入哪個會話,這意味着哪個連接字符串。 如果我只有一個單身工廠,我會得到不同的網址錯誤的會話(不同的分辨率)

我希望我解釋一下,讓大家都能理解。 謝謝

回答

1

假設所有的數據庫都具有相同的模式,您可以使用自定義的DriverConnectionProvider動態地切換連接。在下面的代碼中,我將web.config中的連接字符串加載到字典中,然後使用URL中的「租戶」路由值檢索它們。

public class TenantConnectionProvider : DriverConnectionProvider 
{ 
    private IDictionary<string, string> _tenantConnectionStrings; 

    public override void Configure(IDictionary<string, string> settings) 
    { 
     // Load connection strings from config file 
     _tenantConnectionStrings = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); 
     foreach (ConnectionStringSettings connectionStringSetting in ConfigurationManager.ConnectionStrings) 
     { 
      _tenantConnectionStrings.Add(connectionStringSetting.Name, connectionStringSetting.ConnectionString); 
     } 

     base.Configure(settings); 
    } 

    public override IDbConnection GetConnection() 
    { 
     var connectionString = GetConnectionString(); //not shown, mine is for Web API 
     var connection = new SqlConnection(connectionString); 
     connection.Open(); 
     return connection; 
    } 
} 

我再配置此使用功能NHibernate:

// connection string has to be set even though custom provider is used 
var config = Fluently.Configure() 
    .Database(MsSqlConfiguration.MsSql2008.ConnectionString("custom").Provider<TenantConnectionProvider>) 
    .Mappings(m => 
    { 
     m.FluentMappings.AddFromAssemblyOf<MyClass>(); 
    }); 
+0

感謝您的迴應。但我想ISession注入到DAO對象。現在IOC如何知道在運行時注入哪個ISession? – user3329192

+1

假設你使用session-per-request,只有一個ISession。會話工廠將在每次創建會話時使用自定義DriverConnectionProvider提供的連接提供會話。依賴注入框架只需要注入ISession,沒有別的。 –

0

你必須有2個SessionFactories(1元DB),併爲每一個註冊名爲會話。

我只跟Autofac經驗(其它國際奧委會應該工作一樣)

.Register<ISession>(factory1.OpenSession()).Named("f1"); 
.Register<ISession>(factory2.OpenSession()).Named("f2"); 

的枚舉,而不是字符串可以使用。

鑑於該會議是依賴於網址以某種方式(和使用的IoC集成),唯一的辦法,我看到的是具有啓動處理程序:

.Register<IRepository>().OnActivating(e => { 
var db = HttpContext.Current.Request.Url....//some code to find the db 
var dep = e.Context.Resolve<ISession>("f1"); 
    e.Instance.SetTheDependency(dep);}) 

或財產注入

相關問題