Suggerimenti necessari su un'architettura per più client e un'applicazione web personalizzabile

3

Il nostro prodotto è un sistema di gestione del corso basato sul web. Abbiamo più di 10 clienti e in futuro potremmo avere più clienti. (Asp.net, SQL Server)

Attualmente, se uno dei nostri clienti necessita di funzionalità aggiuntive o di logica aziendale personalizzata, cambieremo lo schema e il codice db per soddisfare le esigenze.

(abbiamo solo una base di codice filiale e uno schema di database)

Per fare in modo che la modifica non si influenzi reciprocamente, utilizziamo un flag client, definito in un file di configurazione Web, quindi quei campi extra e la logica biz applicata solo a un particolare sistema del cliente.

if(ClientId = 'ABC')
{
   //DO ABC Stuff
}
else
{
   //Normal Route
}

Uno dei nostri colleghi senior ha detto, in questo modo, una piccola azienda come noi può risparmiare risorse sul supporto di più risorse.

Ma quello che sento è che questa strategia rende il nostro codice e il nostro database ancora più difficili da mantenere.

Qualcuno ha attraversato una situazione simile? Come lo gestisci?

    
posta ValidfroM 04.09.2012 - 17:53
fonte

3 risposte

3

Parametrizza il più possibile, naturalmente.

Evita di scrivere:

if(customer == 'foo') {
  doBarCalculation();
}

, ma scrivi:

if(customer.usesBarCalculation) {
  doBarCalculation();
}

Utilizza il modello di strategia:

customer.getCalculation().doCalculation();

Customer {
  CalculationStrategy getCalculation();
}

CalculationStrategy {
  doCalculation();
}

; puoi usare la strategia a diverse scale; o offrono molte piccole, semplici interfacce o alcune grandi interfacce: vale la pena di pensare bene alla scala; le grandi interfacce tendono a provocare la duplicazione del codice tra le implementazioni (e la duplicazione del codice è errata), mentre le interfacce più piccole sono spesso più difficili da progettare in anticipo o aumentare la complessità.

    
risposta data 04.09.2012 - 22:16
fonte
1

Crea una tabella di società nel database. Ogni utente viene associato a un'azienda. Ecco alcuni pseudo-SQL per le personalizzazioni aziendali per la visualizzazione di date, fuso orario, scostamento fiscale e persona di contatto:

table user:
id
company_id
... other fields ...
foreign key (company_id)

table company:
id
date_format
time_zone
fiscal_offset
contact_person
... other customization fields ...

Probabilmente hai bisogno di interrogare l'utente e la società per la maggior parte degli schermi per testare le personalizzazioni. Tirare un singolo record dal database per uno schermo non dovrebbe richiedere più di 5 ms.

Capisco che non vuoi introdurre complessità, ma avere un codice specifico dell'azienda per ogni cliente disseminato nella tua applicazione è già complesso. Meglio inserirla ufficialmente nel proprio modello di database, piuttosto che svegliarsi un giorno con 100 personalizzazioni di società una tantum disseminate nel codice. Almeno questo li mette tutti in un posto, e guardando queste impostazioni sulla schermata di modifica della società, i tester possono vedere facilmente a cosa devono pensare quando effettuano i test per diverse aziende.

    
risposta data 04.09.2012 - 18:22
fonte
0

La tecnica descritta è una buona soluzione per fermare la gabbia ma non si adatta bene. Va bene se hai solo pochi casi.

Mi piacciono entrambe le soluzioni di Alex e GlenPeterson sopra

  1. Parametrizzazione: rende i diversi casi generalizzati e riutilizzabili. eq .: consente la spedizione internazionale (S / N) o rompere le tasse di spedizione (S / N).

  2. Attributi flag del database - per registrare le preferenze di ogni cliente

Oltre a queste tecniche altre cose da considerare:

  1. Codebase separati. Isolare le funzionalità di base in un'unica base di codice. Personalizzazione del cliente in una base di codice diversa che utilizza la base del codice principale. Questo può essere difficile da configurare, ma consente di sviluppare liberamente entrambe le codebase in modo indipendente. Avere buoni test sulla base del codice core aiuterà a evitare di rompere le basi di codice personalizzate.

  2. Separa i database (uno per ogni client) o Namespace le tue tabelle di database (una tabella per ogni client)

  3. Utilizza file di configurazione separati per ciascun cliente. Yaml è ottimo per i file di configurazione. Questo può essere molto più leggero di mettere tutti i flag nel database e ti permette di modificarlo facilmente.

risposta data 27.09.2017 - 14:53
fonte

Leggi altre domande sui tag