Ik ben bezig met 'applicatie' te maken (eerder een soort plugin) die door verschillende applicaties hier kan gebruikt worden.
Bepaalde gegevens die hier gebruikt worden door deze 'plugin' worden in een database opgeslagen, en sommige van deze gegevens zijn 'relatief tot een bepaalde applicatie (laat ons zeggen de host van de plugin)', andere dan weer niet.
Dwz dat ik bv één database kan hebben, die door die plugin uit verschillende host-applicaties kan gebruikt worden.
Om dit te verwezenlijken, heb ik in deze databank een tabel 'ExternalApplication' gemaakt, waarin de verschillende 'hostapplicaties' geregistreerd staan. Gegevens die dus relatief zijn tot een 'hostapplicatie' hebben dus een relatie met deze tabel.
Het 'probleem' (eerder een dillema) dat ik heb, zit 'm nu echter in mijn domein-model.
Om een object te instantieren (en vooral te persisten) van een class die een 'applicatie-relatief' gegeven voorstelt, heb ik 2 mogelijkheden:
- bij het instantieren van zo'n object, geef ik de huidige 'ExternalApplication' instance mee aan de constructor.
bv:
Binnen mijn plugin weet ik op ieder moment de 'host' applicatie. (Binnen de DLL waarin mijn domein-model zich bevindt, weet ik dat echter niet).
- Een tweede manier is gebruik maken van NHibernate interceptors.
Het is zo dat ik gebruik maak van NHibernate's dynamic filtering feature om ervoor te zorgen dat enkel de gegevens die relatief zijn tot de 'huidige' applicatie opgehaald worden uit de database.
Dit doe ik door voor iedere class die een bepaalde interface implementeerd (IExternalApplicationContextAware) een extra filter te definieren:
Daarnaast heb ik dan ook nog een NH interceptor gedefinieerd, zodanig dat deze filters iedere keer geactiveerd worden als ik een nieuwe ISession instantieer.
Nu zou ik deze interceptor zodanig kunnen uitbreiden, zodanig dat, iedere keer er een IExternalApplicationContextAware object gesaved / geupdated wordt, er voor gezorgd wordt dat de link met de huidige ExternalApplication gemaakt wordt.
Dit betekent dus, dat ik de huidige ExternalApplication niet meer hoef mee te geven aan m'n constructor, maar dat mijn 'infrastructuur' er (behind the scenes) voor zorgt dat deze link gemaakt wordt.
Eigenlijk is het antwoord simpel:
Behoort het concept van 'ExternalApplication' tot mijn domein-model, dan zou ik die ExternalApplication meegeven aan de constructor.
Indien het ExternalApplication concept niet tot mijn domein-model behoort, dan vind ik dat ik gebruik kan maken van die NHibernate interceptor.
Ik hoop dat je nog kunt volgen.
Bepaalde gegevens die hier gebruikt worden door deze 'plugin' worden in een database opgeslagen, en sommige van deze gegevens zijn 'relatief tot een bepaalde applicatie (laat ons zeggen de host van de plugin)', andere dan weer niet.
Dwz dat ik bv één database kan hebben, die door die plugin uit verschillende host-applicaties kan gebruikt worden.
Om dit te verwezenlijken, heb ik in deze databank een tabel 'ExternalApplication' gemaakt, waarin de verschillende 'hostapplicaties' geregistreerd staan. Gegevens die dus relatief zijn tot een 'hostapplicatie' hebben dus een relatie met deze tabel.
Het 'probleem' (eerder een dillema) dat ik heb, zit 'm nu echter in mijn domein-model.
Om een object te instantieren (en vooral te persisten) van een class die een 'applicatie-relatief' gegeven voorstelt, heb ik 2 mogelijkheden:
- bij het instantieren van zo'n object, geef ik de huidige 'ExternalApplication' instance mee aan de constructor.
bv:
code:
1
| PrestationGroup pg = new PrestationGroup (MyPluginManager.Current.ExternalApplication); |
Binnen mijn plugin weet ik op ieder moment de 'host' applicatie. (Binnen de DLL waarin mijn domein-model zich bevindt, weet ik dat echter niet).
- Een tweede manier is gebruik maken van NHibernate interceptors.
Het is zo dat ik gebruik maak van NHibernate's dynamic filtering feature om ervoor te zorgen dat enkel de gegevens die relatief zijn tot de 'huidige' applicatie opgehaald worden uit de database.
Dit doe ik door voor iedere class die een bepaalde interface implementeerd (IExternalApplicationContextAware) een extra filter te definieren:
code:
1
2
3
4
5
6
7
8
9
| cfg.AddFilterDefinition ( .... ); foreach( var mapping in cfg.ClassMappings ) { if( typeof(IExternalApplicationContextAware).IsAssignableFrom (mapping.MappedClass) ) { mapping.AddFilter (...); } } |
Daarnaast heb ik dan ook nog een NH interceptor gedefinieerd, zodanig dat deze filters iedere keer geactiveerd worden als ik een nieuwe ISession instantieer.
Nu zou ik deze interceptor zodanig kunnen uitbreiden, zodanig dat, iedere keer er een IExternalApplicationContextAware object gesaved / geupdated wordt, er voor gezorgd wordt dat de link met de huidige ExternalApplication gemaakt wordt.
Dit betekent dus, dat ik de huidige ExternalApplication niet meer hoef mee te geven aan m'n constructor, maar dat mijn 'infrastructuur' er (behind the scenes) voor zorgt dat deze link gemaakt wordt.
Eigenlijk is het antwoord simpel:
Behoort het concept van 'ExternalApplication' tot mijn domein-model, dan zou ik die ExternalApplication meegeven aan de constructor.
Indien het ExternalApplication concept niet tot mijn domein-model behoort, dan vind ik dat ik gebruik kan maken van die NHibernate interceptor.
Ik hoop dat je nog kunt volgen.

https://fgheysels.github.io/