Το NHibernate χρησιμοποιεί δύο διαφορετικά είδη config αρχείων. Αρχεία με την κατάληξη .cfg.xml περιέχουν ρυθμίσεις που αφορούν τη λειτουργία του NHibernate (π.χ. Caching) και αναφορές στα mapping αρχεία, τα οποία περιγράφουν την αντιστοίχιση μεταξύ object properties και πεδίων πινάκων. Οι αναφορές σε mapping αρχεία γίνονται με τη χρήση του tag <mapping ...>. Το tag αυτό δέχεται επιπλέον attributes τα οποία προσδιορίζουν αν το mapping file είναι αρχείο στο σκληρό ή είναι embedded resource σε κάποιο assebbly. Αυτά είναι το file και το resource αντίστοιχα. Τέλος, αντί για .cfg.xml αρχεία μπορεί να χρησιμοποιηθεί και το app.config αρχείο μίας εφαρμογής. Στην περίπτωση αυτή, προσθέτουμε άλλο ένα section στο app.config με τις ρυθμίσεις του NHibernate. Όλα τα παραπάνω περιγράφονται στο documentation του NHibernate.
Στην ερώτηση τώρα. Προφανώς, μία λύση είναι να προσθέσει κανείς πολλαπλά <mapping> tags στο app.config. Το πρόβλημα εδώ είναι ότι ακόμα και αν δώσουμε ένα relative path για το κάθε mapping file, θα δείχνει σε διαφορετικό folder κατά τη διάρκεια του debug και σε διαφορετικό όταν εγκατασταθεί η εφαρμογή! Θα μπορούσαμε να βάλουμε όλα τα mapping files στο ίδιο folder με το app.config και να τα αντιγράφουμε στο bin\debug, αλλά αυτή φαίνεται κάπως βρώμικη λύση, ειδικά αν έχουμε πολλές κλάσεις και mapping files.
Έυτυχώς, υπάρχει μία πολύ καλύτερη λύση. Το NHibernate δεν περιορίζεται να φορτώνει τα mapping files από το δίσκο, μπορεί άνετα να τα φορτώσει και από assembly resources. Μάλιστα, με μία γραμμή κώδικα, το NHibernate μπορεί να φορτώσει όλα τα resources που έχουν κατάληξη .hbm.xml από ένα assembly και να τα χρησιμοποιήσει. Το μόνο που χρειάζεται να γράψουμε είναι:
NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration().AddAssembly("MyAssembly");
Και όλα τα mapping files που βρίσκονται μέσα στο MyAssembly.dll θα φορτωθούν. Το μόνο που χρειάζεται μετά από αυτό, είναι να προσθέσουμε όλα τα mapping files στο project του MyAssembly.dll και στα File Properties να θέσουμε το Build Action σε Embedd Resource.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos