Nella mia azienda, abbiamo una soluzione composta da un WinForm (multiplo per client) e un'API (uno per client). Questa soluzione viene distribuita su client diversi che richiedono che la soluzione si comporti diversamente in base ai propri desideri. Lo stesso codice base deve supportare le personalizzazioni dell'interfaccia utente (logo del client, visibilità dei pulsanti) e personalizzazioni delle funzionalità (chiamando lo stesso WebMethod con diversi flag).
Attualmente gestiamo questa flessibilità dal lato WinForm avendo una classe Organization
che contiene tutte queste personalizzazioni (flag). L'API è totalmente indipendente dal client. Pertanto, i metodi di WinForm hanno questo aspetto:
this.Logo = CurrentOrganization.LogoImage;
API.GetProducts(Organization.UsesPagination);
In passato, avevamo direttive di compilazione condizionale sparse nel codice:
#IF CLIENT_A
API.GetProductsWithPagination();
#ELSE
API.GetProducts();
#ENDIF
Oggi abbiamo una singola zona con quelle direttive di build condizionali che, in base alla configurazione di build, istanzia la classe Organization
richiesta. In seguito, non ci sono più IF, passaggio parametri.
Sono un po 'preoccupato che questo non sia il miglior design o la soluzione più gestibile . Ho studiato il pattern di stato ... Suppongo che Organization
sia il mio oggetto di strategia, poiché indica ad altri metodi come dovrebbero comportarsi attraverso le bandiere.
C'è un un modo migliore ?
- Memorizzazione delle configurazioni su una tabella DB? (richiede più richieste all'API, che costa tempo)
- Memorizzazione delle configurazioni su un file * .config? (qualcuno può facilmente modificare il comportamento dell'app modificando il file)