Lavorando ad un progetto InDe Cloud, in cui la web app utilizza i dati di un’applicazione foundation tramite WebAPI, mi sono scontrato con una necessità forse interessante anche per altri.
Premetto che l’applicazione foundation è strutturata così:
Un database unico in cui risiedono i dati comuni a tutte le aziende utilizzatrici, più la tabella con i dati identificativi di queste aziende. Questo database prende il nome di Globale.
Un database separato per ogni azienda utilizzatrice, con i dati gestiti da quell’azienda.
Al login, l’utente dichiara l’azienda in cui lavora e l’applicazione modifica di conseguenza la connection string al database aziendale, lasciando inalterata quella al database globale.
A livello di server web, per ora c’è un unico server web da cui è possibile accedere al db globale e a tutti i db aziendali. Più avanti però potrebbero esserci più installazioni della stessa applicazione foundaiton, ognuna con uno o più database aziendali. In pratica, avremo un server web centrale con i dati globali, e più server web aziendali con i dati delle aziende.
In questo contesto, l’applicazione cloud che consuma le WebAPI dell’applicazione foundation deve poter modificare l’Endpoint delle classi in fase di login, differentemente tra sessione e sessione.
Purtroppo però il metodo previsto non supporta questa possibilità:
App.NwindLibreria.MyODataAPI.init = function (app)
{
App.NwindLibreria.Products.webApiEndpoint = {
type : "NwindLibreria.MyODataAPI",
url : "https://prod3-pro-gamma.instantdevelopercloud.com/academy"
};
...
};
Modificando l’Endpoint a livello di App (A maiuscola), lo si modifica a livello di installazione, e quindi per tutte le sessioni. Lo stesso non è previsto a livello di app (a minuscola).
La soluzione suggerita dall’assistenza è:
Intercettare l’evento OnInit di ogni classe ed eseguire da lì la personalizzazione:
this.webApiEndpoint = new App.NwindLibreria.MyODataAPI(app);
this.webApiEndpoint.url = "https://prod3-pro-gamma.instantdevelopercloud.com/academy";
Questa soluzione, seppur funzionante, fa nascere due ulteriori esigenze:
- Avere un metodo per la modifica dell’Endpoint a livello di sessione.
- Poter globalizzare gli eventi documentali, in modo tale da centralizzare le operazioni che tutte (o buona parte) di esse devono eseguire.
Che ne dite?