Should the domain layer be dependent on NHibernate in this scenario?
Da una prospettiva purista: no non dovrebbe. Il livello del dominio non dovrebbe comportare una serie di dipendenze dalla soluzione di persistenza. "UnitOfWork" e "Transazione" non fanno parte del linguaggio ubiquitario della maggior parte dei domini aziendali.
Dal punto di vista della cipolla: la tua dipendenza sta indicando la strada sbagliata. Invece di aggiungere una dipendenza da NHibernate, puoi inserire un'interfaccia di fornitore di servizi agnostico nel tuo modulo e quindi passare un'implementazione di NHibernate dell'interfaccia agnostica alle porte che ne hanno bisogno.
In pratica: dubito che la polizia DDD verrà a cercarti.
Domain Services can access the database
Non proprio giusto. Implementazioni di Domain Services
possono accedere al database. L'interfaccia , utilizzata dal modello di dominio, esprime semplicemente il servizio nella lingua del dominio. L'implementazione si baserà su altri servizi applicativi e di infrastruttura, ovvero su altri fornitori di servizi di interfacce che definisce e sulle sue tartarughe.
La cosa che effettivamente parla di NHibernate probabilmente sarà un servizio di infrastruttura.
In altre parole, probabilmente la tua composizione root avrà un aspetto simile a
NHibernateThing nhibernate = ...
DomainServiceImpl.Adapter infrastructure = InfrastructureService.using(nhibernate)
DomainService service = DomainServiceImpl.using(infrastructure)
dove si collega ciascun adattatore alla porta appropriata a sua volta.
Rileggi Parnas ; a un livello fondamentale, NHibernate è il risultato di una decisione e si desidera che i limiti del modulo siano in grado di separare i pezzi che dipendono da tale decisione dai pezzi che non lo fanno. Ciò rende più facile cambiare quando arriva il momento.
Ma - dovresti bilanciare questo contro il rischio di cambiamento; se NHibernate farà sempre parte della tua soluzione, non dovresti investire nel disaccoppiarlo dal tuo dominio.