Lo scenario più semplice è quello della generazione del “numero fattura” in fase di insert del nuovo documento, tralasciamo per ora le più svariate possibilità legate al concetto di bozza, ad un certo punto avete la necessità di generare questo benedetto numero che deve sottostare a determinate regole. La stessa cosa può succedere in altri casi, come ad esempio la generazione di un codice cliente, e questo ci permette di generalizzare dicendo che:
  1. Abbiamo la necessità di generare un codice univoco;
  2. Questo codice univoco deve essere umanamente leggibile e avere un significato nel mondo reale, quindi niente guid;
  3. Il codice generato deve sottostare a delle regole, come ad esempio:
    1. deve essere progressivo, e la progressione potrebbe dipendere dall’uso: numerica, alfabetica, quellochemicipiaceame… :-)
    2. potrebbe avere una logica di reset: il numero fattura si resetta ad inizio anno ad esempio;
    3. etc…
In molti casi si potrebbe addomesticare il tutto con dell’ottimo codice t-sql e siccome non è un male spesso e volentieri lo faccio, del resto la logica di generazione del numero fattura è decisamente banale, ma non è sempre così potreste avere delle casistiche, nel mio caso la generazione del codice cliente, in cui non è proprio banale far girare l’algoritmo in codice t-sql.
In che modo NHibernate ci può essere di aiuto? da questa necessità è nato un thread, con Fabio Maulo, sullo user group italiano di NHibernate.
Fabio propone di:
  • definire la logica di generazione come entità di dominio;
  • definire nello schema del db una tabella che ospita le caratteristiche di questa logica:
    • ad esempio ultimo numero generato e data di generazione dell’ultimo numero, nel caso di una fattura;
  • in fase di insert
    • caricare da db questa entità;
    • chiederle di generare un nuovo id;
    • eseguire l’update, del “generatore”, e l’insert della nuova entità, ad esempio la fattura, con un lock;
Adesso la domanda che sorge spontanea, e che ho inevitabilmente ribaltato al capo, è: ma sta roba la delego al dev che si occupa del processo di insert o deve essere implicita e quindi automatica?
A mio modo di vedere questo è uno di quei problemi molto borderline da un lato la logica di generazione del “numero documento” è logica di business ma dall’altro è strettamente dipendendente dallo storage e il boss propone di automatizzare questo giro, ergo una possibilità sono gli eventi di NHIbernate per inserirsi nella pipeline di salvataggio e a questo punto fare il bello e cattivo tempo.
.m