La mia azienda deve creare un'applicazione da implementare per molti clienti. Questo software avrà molti moduli e funzionalità, ma alcuni di questi avranno bisogno di aggiustamenti specifici per alcune aziende. Tali aggiustamenti potrebbero essere di natura minore (come un nuovo input in un modulo) o potrebbero essere le principali personalizzazioni, come cambiare l'intero modulo con diversi passaggi e regole aziendali prima di salvare / modificare / eliminare. Ci si può aspettare che la personalizzazione possa anche portare ad alcune modifiche a livello di database, come nuove colonne.
L'applicazione esiste già, ma non abbiamo ancora incluso queste modifiche. L'applicazione utilizza .NET, WebApi, AngularJs. Come modello di progettazione dell'architettura software utilizziamo microservizi e un approccio DDD (Domain Driven Design). La struttura delle soluzioni di Visual Studio è la seguente:
- WebApp: rotte, JS, CSS, html.
- Interfaccia modulo: controller e servizi WebApi
- Dominio del modulo: contesti limitati, radici di aggregazione, dominio.
- Infrastruttura del modulo: unità di lavori, archivi, validatori di persistenza, mappatura delle entità
Un'idea per controllare questo scenario complesso utilizza diversi rami (su git) per ogni cliente. Ma questo potrebbe portare al problema che abbiamo bisogno di mantenere diverse applicazioni in futuro.
Pensiamo che sia molto meglio mantenere tutto in un unico ramo. Ma abbiamo molti dubbi su come realizzarlo in maniera positiva (best practice?).
Ad esempio, immagina un CRUD per il dominio "Utente" che può avere regole aziendali diverse su client diversi. Problemi che vediamo:
-
Abbiamo bisogno di creare diversi metodi di salvataggio sul dominio degli utenti? Come "saveForClient1", "saveForClient2" ...?
- Temiamo che l'ereditarietà dei domini possa avere un impatto negativo sul nostro approccio DDD per questo problema.
-
Se la personalizzazione è così grande che è necessario creare file HTML / Javascript e file .cs diversi, ma anche usare codice già esistente, come può essere organizzato in un modo "carino"?
Aggiornato (18/10/2016)
Ho cambiato lavoro prima di andare più a fondo nella soluzione, ma ci sono commenti che chiedono quale strategia scegliamo.
Utilizzare diversi rami è l'idea peggiore. La strategia migliore è controllare le differenze nel codice, creando diversi pacchetti, file e percorsi delle risorse REST per organizzare questo codice e partecipare alle funzionalità specifiche. Utilizzare le interfacce e l'iniezione delle dipendenze per mantenere lo stesso contratto nel sistema ma con diverse implementazioni per i client. DDD può aiutarti a isolare questi casi in cui alcune informazioni dal database sono specifiche del cliente.
Nel front-end, è una buona idea scegliere una libreria indolore per aiutarti a costruire interfacce, ottenendo flessibilità per creare interfacce diverse riutilizzando gli stessi componenti (come React).