Verwalten mehrerer Datenbanken mit NHibernate und Autofac

8

Ich dachte, ich würde diese Frage dort herausbringen, während ich selbst eine Lösung für mich schuf.

Nachdem ich den Großteil der Anwendung erstellt habe, muss ich in letzter Minute das Lesen / Schreiben in eine zusätzliche Datenbank unterstützen (insgesamt 2, keine anderen). Ich habe die Anwendung mit NHibernate erstellt, wobei Autofac die DI / IoC-Komponenten lieferte. FWIW, das befindet sich in einer ASP.NET MVC 2-App.

Ich habe eine generische Repository-Klasse, die eine NHibernate-Sitzung benötigt. Theoretisch kann ich dieses generische Repository ( IRepository<> ) für die zweite Datenbank weiterhin verwenden, solange die Session, die an sie übergeben wird, von einer entsprechenden SessionFactory stammt, richtig?

Nun, wenn die App startet, erledigt Autofac das. In Bezug auf die Session und SessionFactory habe ich ein Modul, das besagt:

%Vor%

wo ConfigureNHibernate (), die die Basis-SessionFactory zurückgibt, wie folgt aussieht:

%Vor%

Derzeit ist dies auf nur eine Datenbank beschränkt. In jedem anderen NHib-Szenario würde ich wahrscheinlich Instanzen der separaten SessionFactories in einen Hash schieben und sie bei Bedarf abrufen. Ich möchte das Ganze nicht neu gestalten müssen, da wir kurz vor einer großen Veröffentlichung stehen. Ich vermute also, dass ich zumindest die oben genannten Methoden modifizieren muss, um zwei SessionFactories unabhängig konfigurieren zu können. Mein grauer Bereich ist, wie ich gehen werde, um die richtige Factory anzugeben, die mit einem bestimmten Repository verwendet wird (oder zumindest für Entitäten, die für diese zweite Datenbank spezifisch sind).

Jeder hat Erfahrung mit diesem Szenario bei der Verwendung eines IoC-Containers und NHibernate auf diese Weise?

BEARBEITEN Ich habe eine GetSessionFactory-Methode ausgedruckt, die einen Konfigurationsdateipfad verwendet, in HttpRuntime.Cache nach dem Vorhandensein einer passenden SessionFactory sucht, eine neue Instanz erstellt, falls noch keine vorhanden ist, und diese SessionFactory zurückgibt. Jetzt muss ich noch raushauen, wie ich Autofac sagen kann, wie und wann man einen geeigneten Konfigurationsweg angeben muss. Die neue Methode sieht wie folgt aus (stark ausgeliehen aus Billys 2006 Post hier ):

%Vor%     
nkirkes 14.12.2010, 20:33
quelle

1 Antwort

11

Ich gehe davon aus, dass Sie verschiedene Typen von Entitäten in jede Datenbank aufnehmen möchten; Wenn Sie die gleichen Arten von Entitäten in jeder Datenbank behalten möchten, lesen Sie AutofacContrib.Multitenant.

Die zwei Zutaten, die bei diesem Szenario helfen können, sind:

  • Benannte Dienste Ссылка
  • Gelöster Parameter Ссылка (minimale Dokumentation zu diesem Thema - die kommende Version von Autofac 2.4 enthält einige Syntax-Süßstoffe um diese ...)

Verwenden Sie zuerst benannte Dienste, um auf die zwei verschiedenen Datenbanken zu verweisen. Ich nenne sie "db1" und "db2 ". Alle Komponenten, die sich auf die Datenbank bis hin zur Sitzung beziehen, werden mit einem Namen registriert:

%Vor%

Nehmen Sie nun an, dass Sie einen Typ NHibernateRepository<T> haben, der einen ISession als Konstruktorparameter akzeptiert und dass Sie eine Funktion WhichDatabase(Type entityType) schreiben können, die entweder "db1" oder "db2" zurückgibt, wenn der Typ von an gegeben wird Entität.

Wir verwenden ResolvedParameter , um die Sitzung basierend auf dem Entitätstyp dynamisch auszuwählen.

%Vor%

(Warnung - kompiliert und getestet in Google Chrome;))

Nun wird durch das Auflösen von IRepository<MyEntity> die entsprechende Sitzung ausgewählt und die Sitzungen werden weiterhin durch Autofac initialisiert und ordnungsgemäß entsorgt.

Sie müssen natürlich sorgfältig über das Transaktionsmanagement nachdenken.

Hoffe, das macht den Trick! NB

    
Nicholas Blumhardt 15.12.2010, 21:39
quelle