2013-01-22 8 views
6

Feature flags è qualcosa che uso spesso ma non ci ho mai pensato molto fino a quando non è iniziato questo nuovo progetto a cui sto lavorando.L'implementazione di flag di funzionalità in C#

solito attuarla con un sacco di chiavi nel mio file web.config, ma questo approccio ha due grossi inconvenienti:

  1. Quando si modifica un valore all'interno web.config il pool di applicazioni viene riavviato - Questo può essere un problema in un ambiente di accesso pesante
  2. Avere troppi chiavi nel file web.config è confusa e può ottenere abbastanza disordinato

Qual è il modo migliore per superare questi problemi?

+1

Quante bandiere è probabile avere? –

+0

Di solito ne ho solo pochi. Meno di 10. Ma con una buona implementazione posso vederlo crescere per aiutare con l'ammissione delle applicazioni. – tucaz

risposta

4

Non è necessario memorizzare contrassegni funzione in web.config.

Un'opzione è quella di archiviarli in un database - questo ha l'ulteriore vantaggio di lavorare bene in una web farm.

Si noti che con i flag di funzionalità, una volta che si è in una posizione in cui una funzionalità sarà permanentemente attivata o disattivata (ad esempio quando si passa da widgetA a widgetB e non sarà più necessario alcun codice widgetA), è necessario rimuovere la funzione e il flag associato. Questo aiuterà a gestire il set di funzionalità.

+3

@Downvoter - cura di commentare? – Oded

+0

hai ragione, ti chiedo come superare quello, non quello che ho tipo, quindi lo cancello. (Dico solo di usare ancora web.config che è qualcosa di diverso) – Aristos

7

Vorrei suggerire di utilizzare IoC per astrarre l'implementazione dei flag di funzionalità: tutto il codice necessario per accedere è qualcosa sulla falsariga di IFeatures.IsEnabled("FeatureA"). Una volta fatto questo, è possibile scegliere la più sensata realizzazione - alcuni suggerimenti qui sotto:

  • implementazione web.config (compatibile con quello che hai ora)
  • implementazione del database (con valori memorizzati nella cache, possibilmente utilizzando SqlDependency se si desidera lavorare su una Web farm)
  • Implementazione separata del file di configurazione (memorizzata nella cache, ma utilizzando un FileSystemWatcher per verificare le modifiche al file di configurazione e caricarle senza dover riavviare il pool di applicazioni). Ciò consente il caso in cui sono necessarie funzionalità definite prima che sia necessario il DB.
+3

Come ulteriore suggerimento, cerca di usare enumerazioni invece di stringhe magiche per le bandiere. È più facile individuare dove vengono utilizzati quando si desidera pulirli o cambiare i loro nomi e Intellisense ricorda alle persone quali flag sono stati definiti, riducendo le possibilità di creare duplicati. –