Hinzufügen von Zuordnungen nach Namespace in Fluent NHibernate

8

In meiner Anwendung muss ich mit mehreren Datenbanken sprechen. Ich behandle das in NHibernate, indem ich eine SessionFactory pro Datenbank erstelle (ich nehme an, das ist die richtige Sache). Also habe ich zwei Sätze von Modellen (eine pro Datenbank) und zwei Sätze Fluent NHibernate ClassMap<> Mappings. Beide sind im selben Projekt (getrennt durch Namespace) und ich möchte es so behalten.

Das Problem tritt beim Erstellen der SessionFactory auf. Soweit ich sehen kann, hat Fluent NHibernate zwei Methoden zum Hinzufügen von Zuordnungen:

%Vor%

Wenn ich die erste Überladung verwende, erhalten meine Sitzungsfactories alle Zuordnungen für beide Datenbanken. Wenn ich die zweite benutze, muss ich jede einzelne ClassMap angeben. Ich möchte etwas wie FluentMappings.AddFromNamespace() . Gibt es eine Möglichkeit, dies zu tun?

    
Gabe Moothart 01.06.2011, 16:25
quelle

4 Antworten

16

Es ist merkwürdig, dass FluentNHibernate diese Art der Filterung für die automatische Zuordnung unterstützt, aber nicht für ClassMap s. Es sollte nicht allzu schwer sein, diese Funktion selbst hinzuzufügen, und zwar über die Magie der Erweiterungsmethoden. Versuchen Sie Folgendes:

%Vor%

... und benutze es so:

%Vor%     
Daniel Schilling 01.06.2011, 20:17
quelle
10

Ich habe eine Erweiterungsmethode geschrieben, die das für mich tut. Im Grunde verwendet es Reflexion, um über alle Typen, die ich interessiere, zu iterieren und sie einzeln hinzuzufügen. Es basiert auf der Implementierung von AddFromAssemblyOf . Verwendung:

%Vor%

Implementierung:

%Vor%

Vorbehalte:

  • Der Name ist ein wenig irreführend, da er nur eine Assembly durchsucht. Es sollte vielleicht AddFromAssemblyAndNamespaceOf heißen, aber das ist ein wenig wortreich.
  • Es ist nicht völlig zukunftssicher. Wenn zukünftige Versionen von FNH einige der mappbaren Schnittstellen hinzufügen oder entfernen, werden sie nicht einbezogen.

Aber es funktioniert für meine Zwecke.

    
Gabe Moothart 01.06.2011 20:19
quelle
0
%Vor%     
VahidN 01.06.2011 19:51
quelle
0

Es gibt keine Möglichkeit, dies zu tun. Ich empfehle, die Namespaces in separate Projekte zu trennen. Denken Sie daran:

Separate Namespaces, dasselbe Projekt, wenn logische Trennung sinnvoll ist. Separate Namespaces, separate Projekte, wenn eine räumliche Trennung sinnvoll ist.

In diesem Fall ist eine physische Trennung sinnvoll, da Sie in Nhibernate-Zuordnungen nicht nach Namespace trennen können. Sie können dies jedoch mit fließenden Automaps umgehen, die eine .Where- oder eine ShouldMap-Konfiguration verwenden. Suchen Sie nach fließenden Automaps und prüfen Sie, ob Sie dorthin gelangen, wo Sie hinwollen.

    
Fourth 01.06.2011 19:47
quelle