Toon posts:

[NHibernate] inheritance objecten uit generiek domein

Pagina: 1
Acties:

Verwijderd

Topicstarter
In .NET heb ik een object model ontworpen voor een heel specifiek business domain wat bij verschillende klanten gebruikt wordt. Data persistance wordt mbv NHibernate getackled. Dit domein model zit in een los .NET project en de resulterende class library (dll) wordt gebruikt in projecten voor onze klanten (elke klant heeft een eigen db).

We lopen nu tegen het volgende probleem aan: een klant wil bepaalde eigenschappen laten toevoegen aan een aantal objecten. Deze eigenschappen zullen andere klanten niet gebruiken, dus wensen we deze niet in het 'algemene domein model' op te nemen. Natuurlijk kunnen we voor deze klant in zijn .NET project overervingen maken van de objecten in het bestaande model. Maar van de NHibernate mapping files kan volgens mij niet (deze zitten nu nog als embedded resources in de dll met het generieke domein).

Om bovenstaande samen te vatten: is het mogelijk additionele NHibernate mapping files voor het overerfde object toe te voegen die alleen de nieuwe properties aangeven? Of benaderen jullie dit op een andere manier?

Alvast bedankt voor jullie inzichten!

  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 20-11 21:40

Not Pingu

Dumbass ex machina

Gezien je nu een eigen DLL met embedded hbm files gebruikt, neem ik aan dat je je SessionFactory aanmaakt op basis van de assembly? Het is helaas niet mogelijk om Sessions aan te maken gebaseerd op meerdere assemblies. Daar liepen we op het werk tegenaan bij het ontwikkelen van een modulair CMS. De core zou in 1 assembly zitten, maar je loopt tegen problemen aan als je losse modules ook hun eigen assembly wilt geven.

Een mogelijkheid is natuurlijk het gebruiken van de losse HBM files en die inladen via het filesystem. Daar kun je wel vrij flexibel mappings aan toevoegen, hoewel ik er niet aan zou beginnen om bestaande tabellen/objecten uit te breiden.

Waarom is het niet wenselijk om deze uitbreidingen op te nemen in het algemene model? Je krijgt neem ik aan nu ook een code fork voor klanten die iets speciaals willen, want veranderingen in je datamodel zullen ook in je code behandeld moeten worden.

[ Voor 16% gewijzigd door Not Pingu op 20-01-2007 17:07 ]

Certified smart block developer op de agile darkchain stack. PM voor info.


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 02-11 15:59
Verwijderd schreef op zaterdag 20 januari 2007 @ 16:57:
Om bovenstaande samen te vatten: is het mogelijk additionele NHibernate mapping files voor het overerfde object toe te voegen die alleen de nieuwe properties aangeven? Of benaderen jullie dit op een andere manier?
Jazeker, dit kan via de joined-subclass constructie. Dit heb ik in het verleden met succes toegepast in een systeem waar de basis uit een CMS bestond. In een aparte assembly is toen een class 'Deelnemer' gemaakt die overerft van de CMS 'Gebruiker'. Gaat als een zonnetje. Natuurlijk is er wel iets overhead omdat er altijd een join plaatsvindt, maar in de meeste scenario's zal dit niet voor problemen zorgen.
Not Pingu schreef op zaterdag 20 januari 2007 @ 17:05:
Gezien je nu een eigen DLL met embedded hbm files gebruikt, neem ik aan dat je je SessionFactory aanmaakt op basis van de assembly? Het is helaas niet mogelijk om Sessions aan te maken gebaseerd op meerdere assemblies. Daar liepen we op het werk tegenaan bij het ontwikkelen van een modulair CMS. De core zou in 1 assembly zitten, maar je loopt tegen problemen aan als je losse modules ook hun eigen assembly wilt geven.
Dat is gewoon niet waar. Je kunt prima SessionFactories configureren op basis van meerdere assemblies. Het punt is dat je wel altijd een nieuwe SessionFactory moet builden op het moment dat je een assembly toevoegt. Als je dan ook op hetzelfde moment al een actieve Session hebt, is deze niet meer geldig. Dit is een beetje ranzig opgelost door direct het huidige Request (web scenario) te stoppen en de pagina te redirecten naar zichzelf wanneer de SessionFactory opnieuw gebuild wordt. Het werkt prima en gebruikers merken er eigenlijk niks van.

[ Voor 42% gewijzigd door tijn op 20-01-2007 17:27 ]

Cuyahoga .NET website framework


Verwijderd

Topicstarter
Not Pingu schreef op zaterdag 20 januari 2007 @ 17:05:
Gezien je nu een eigen DLL met embedded hbm files gebruikt, neem ik aan dat je je SessionFactory aanmaakt op basis van de assembly?
In de hibernate.config wordt inderdaad assembly/namespace gebruikt om alle mapping files in te laden.
Een mogelijkheid is natuurlijk het gebruiken van de losse HBM files en die inladen via het filesystem. Daar kun je wel vrij flexibel mappings aan toevoegen, hoewel ik er niet aan zou beginnen om bestaande tabellen/objecten uit te breiden.
We vinden het vooralsnog wel prettig om de mapping files en de objecten waar die betrekking op hebben in dezelfde assembly te houden met het oog op manageability en deployability.

Verder worden niet zozeer bestaande objecten uitgebreid, maar inherited classes toegevoegd. Dit zouden we eventueel nog in dezelfde tabel kwijtkunnen door bijv. een table-per-class-hierarchy inheritance mapping strategie te hanteren.

Verwijderd

Topicstarter
tijn schreef op zaterdag 20 januari 2007 @ 17:20:
Jazeker, dit kan via de joined-subclass constructie. Dit heb ik in het verleden met succes toegepast in een systeem waar de basis uit een CMS bestond. In een aparte assembly is toen een class 'Deelnemer' gemaakt die overerft van de CMS 'Gebruiker'. Gaat als een zonnetje.
De NHibernate joined-subclass kende ik al wel voor table-per-subclass mappings. Maar dan zat het <joined-subclass> element altijd in de mapping file voor die hele class-hierarchy. Hoe ziet dit eruit als ik deze later mbv. een losse hibenate mapping file dan zou willen introduceren?
Dat is gewoon niet waar. Je kunt prima SessionFactories configureren op basis van meerdere assemblies. Het punt is dat je wel altijd een nieuwe SessionFactory moet builden op het moment dat je een assembly toevoegt.
Als je binnen een ASP.NET site een assembly toevoegt wordt het applicatie domein toch al recycled? Dus dan wordt je sessionfactory ook weer opnieuw geinstantieerd.

edit:
It is possible to define subclass and joined-subclass mappings in seperate mapping documents, directly beneath hibernate-mapping. This allows you to extend a class hierachy just by adding a new mapping file. You must specify an extends attribute in the subclass mapping, naming a previously mapped superclass. Use of this feature makes the ordering of the mapping documents important!

<hibernate-mapping>
<subclass name="Eg.Subclass.DomesticCat, Eg"
extends="Eg.Cat, Eg" discriminator-value="D">
<property name="name" type="string"/>
</subclass>
</hibernate-mapping>
Precies wat ik nodig heb (en waar hierboven waarschijnlijk ook op gedoeld wordt)!

[ Voor 25% gewijzigd door Verwijderd op 20-01-2007 18:09 ]


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 02-11 15:59
Verwijderd schreef op zaterdag 20 januari 2007 @ 17:41:

[...]


Als je binnen een ASP.NET site een assembly toevoegt wordt het applicatie domein toch al recycled? Dus dan wordt je sessionfactory ook weer opnieuw geinstantieerd.
Euhm ja, ik bedoelde ook meer het toevoegen van een assembly aan je NHibernate Configuration in code via Configuration.AddAssembly().

Cuyahoga .NET website framework

Pagina: 1