2017-10-23 1 views
0

Ich bin mit Fluent NHibernate aus: https://github.com/jagregory/fluent-nhibernateNHibernate Fluent - Mehrere Datenbanken Konfiguration

Ist es möglich, mehrere Konfiguration für verschiedene Datenbank (unterschiedliche Verbindungszeichenfolge)

  builder.Register(c => 
      Fluently.Configure() 
       .Database(DatabaseConfiguration) // <-- Connection string 1 
       .Mappings(AutoMapping.Configurations) 
       .ExposeConfiguration(cfg => cfg.SetProperty("connection.isolation", "ReadCommitted")) 
       .ExposeConfiguration(cfg => cfg.SetProperty(Environment.CommandTimeout, c.Resolve<IConfig>().SqlCommandTimeoutSeconds.ToString())) 
       .BuildConfiguration()) 
      .SingleInstance(); 

      builder.Register(c => 
      Fluently.Configure() 
       .Database(ReportingDatabaseConfiguration) // <-- Connection string 2 
       .Mappings(AutoMapping.Configurations) 
       .ExposeConfiguration(cfg => cfg.SetProperty("connection.isolation", "ReadCommitted")) 
       .ExposeConfiguration(cfg => cfg.SetProperty(Environment.CommandTimeout, c.Resolve<IConfig>().SqlCommandTimeoutSeconds.ToString())) 
       .BuildConfiguration()) 
      .SingleInstance(); 

    builder.Register(c => 
      c.Resolve<Configuration>() 
       .BuildSessionFactory()) 
      .SingleInstance(); 

Diese Konfiguration ist in Autofac zu haben.

Das aktuelle Verhalten ist das spätere überschreibt die erste Konfiguration.

Mein erwartetes Ergebnis ist, dass ISession wissen sollte, welche Datenbank abhängig von der Entität, die ich abfrage, verwendet werden soll.

Ist das möglich?

Hinweis: Ich habe die Lösung in http://devstoolbox.altervista.org/multiple-connections-using-nhibernate/ erwähnt versucht, aber für mich nicht funktioniert.

Antwort

1

Haben Sie nhibernate, um herauszufinden, welche Verbindung (Sitzung) basierend auf der Entität möglicherweise nicht möglich oder sogar eine sehr gute Idee ist. Was passiert, wenn Sie zwei Entitäten verschiedener dbs beitreten? Was wäre das erwartete Ergebnis?

Was ist, wenn Sie die "richtige" Sitzung in Ihrer Repo- oder Abfrageklasse anfordern? Sie sollten über den Kontext verfügen, in dem erwartet wird, dass die Abfrage in dieser Klasse ausgeführt wird. Recht?

Sie registrieren eine NH-Anschluss-Klasse, die eine konfigurierbare NHibernate Session

public class NHConnection 
{ 
private string _connectionString; 
private Type _markerType; 

public WithConnectionString(string connectionString) 
{ 
    _connectionString = connectionString; 
    return this; 
} 

public NHConnection UseMarkerAssembly(Type markerAssembly) 
    { 
     _markerType = markerAssembly; 
     return this; 
    } 

public ISessionFactory Build() 
{ 
    var config = Fluently.Configure() 
      .Database(_connectionString) // <-- Connection string 2 

      //.Mappings(AutoMapping.Configurations) consider using a configurable markerAssembly for each db like: 
      .Mappings(m => 
      { 
       m.FluentMappings.AddFromAssembly(markerType.Assembly) 
      }); 

      .ExposeConfiguration(cfg => cfg.SetProperty("connection.isolation", "ReadCommitted")) 
      .ExposeConfiguration(cfg => cfg.SetProperty(Environment.CommandTimeout, c.Resolve<IConfig>().SqlCommandTimeoutSeconds.ToString())) 
      .BuildConfiguration()); 
    return config.BuildSessionFactory(); 
} 
} 

//Register the FactoryBuilder in your Autofac Module 

builder.Register(x => new NHConnection().WithConnectionString("your;connectionString:toDb1").UseMarkerAssembly(typeof(MarkerTypeAssemblyForDB1Mappings)).Build()).Keyed<ISessionFactory>("db1").SingleInstance(); 
builder.Register(x => new NHConnection().WithConnectionString("your;connectionString:toDb2").UseMarkerAssembly(typeof(MarkerTypeAssemblyForDB2Mappings)).Build()).Keyed<ISessionFactory>("db2").SingleInstance(); 
builder.Register<Func<string, ISessionFactory>>(c => 
     { 
      IComponentContext co = c.Resolve<IComponentContext>(); 
      return db => co.ResolveKeyed<ISessionFactory>(db); 
     });  


// Resolve the factory for DB 1, 2 or 3 in your query/repo class  

public class QueryClass{ 
    private _factoryLookUp Func<string, ISessionFactory> FactoryLookup { get; set; } 
    public void QueryClass(Func<DataDomain, ISessionFactory> factoryLookup) 
    { 
    _factoryLookUp = factoryLookup; 
    } 

    public executeYourQuery() 
    { 
    using(var session = factoryLookup("db1").OpenSession) 
    { 
     .... 
    } 
    } 

} 
+0

gut erklärt und dies macht Sinn für mich zurück. Ich hatte gehofft, die Sitzungsinitialisierung in Autofac und nicht in jeder der Repo-Klassen aufzulösen. Danke für Ihre Hilfe :) – Danielyap

+0

Ich höre dich. Sie können immer mit einem BaseRepBb1 und BaseRepoDb2 arbeiten, um das Setup auszublenden –