Esistono situazioni in cui l'ambiente distribuito ( sviluppo , test o produzione , ad esempio) potrebbe dettare il risultato di determinate azioni.
Ad esempio, forse un processo di "registrazione utente" riuscito invierà una notifica via email al nuovo utente. Azioni specifiche per l'ambiente:
- Sviluppo: in realtà non invia l'email. I log delle email forniranno abbastanza per gli sviluppatori.
- Test: invia tutte le email a qualche posta in arrivo di [email protected] e non all'indirizzo dell'utente.
- Produzione: invia l'email all'utente
Ho elencato tre possibili soluzioni di seguito.
Valore di configurazione CurrentEnvironment
Un modo per risolvere questo problema, che ho visto molto, è avere un qualche valore di configurazione (che sia in qualche file di configurazione xml o nel database) come CurrentEnvironment
che specifica l'ambiente corrente in cui il sistema è schierato a. Ciò richiederebbe caso / se controlli nel codice per determinare l'azione desiderata:
if(CurrentEnvironment == Environment.Test)
{
// Send all emails to some [email protected] inbox.
}
else if(CurrentEnvironment == Environment.Production)
{
// Send the email to the user.
}
Questa non è una soluzione gestibile secondo me.
Elimina tutti gli indirizzi email
Un altro metodo consiste nell'eseguire uno script di modifica, una volta ripristinato un database, per eseguire quanto segue:
- Rimuovi tutti gli indirizzi email dell'utente (in fase di sviluppo),
- Sostituisci tutti gli indirizzi email dell'utente con [email protected] (in test)
Questo è un ulteriore passo nella procedura di rilascio che, se persa, potrebbe avere dei risultati pericolosi. Inoltre, questa soluzione risolve solo il problema della posta elettronica. Ci sono forse molte altre situazioni in cui l'ambiente conta.
Trasformazione della configurazione
Un'altra idea è quella di utilizzare trasformazioni web.config . In questo modo la configurazione può essere diversa per diversi ambienti. Ad esempio, avremo le seguenti configurazioni:
web.config
web.Development.config
web.Test.config
web.Production.config
La trasformazione può quindi utilizzare diversi "provider" o impostare determinati attributi in base all'ambiente. Ad esempio, un overrideDeliveryAddress
può essere impostato in web.Test.config
:
<EmailService>
<providers>
<add
name="EmailServiceProvider"
type="CustomProviders.EmailServiceProvider, CustomProviders"
smtp="smtp.domain.com" password="xyz"
overrideDeliveryAddress="[email protected]"
enabled="true"
/>
</providers>
</EmailService>
Questa soluzione richiede molto più lavoro, ma è più manutenibile e meno invasiva. Il codice è ora ignaro dell'ambiente.
Quali altri modi possono essere raggiunti sopra? Il codice dovrebbe MAI essere consapevole dell'ambiente?