ASP.NET MVC - Come rendere il codice si comportano in modo diverso durante l'esecuzione a livello locale contro in QA vs. in produzione

StackOverflow https://stackoverflow.com/questions/2022645

Domanda

Domanda: Come rendere il codice si comportano in modo diverso durante l'esecuzione a livello locale contro in QA vs. in produzione?

Esempio: In un'applicazione ASP.NET MVC ho un controller istituito per fornire notifiche e-mail. Durante l'esecuzione di locale su una macchina di sviluppo che voglio le e-mail consegnate al committente, quando in QA non voglio alcuna notifica di posta elettronica uscire e in < strong> Produzione che voglio le notifiche che vanno ai loro destinatari

Grazie

È stato utile?

Soluzione

hanno tre diverse web.configs e aggiungere un appSetting che voi dove siete così dice è possibile determinare se è necessario inviare una e-mail.

Si potrebbe anche definire costanti nel web.config utilizzando le CompilerOptions attributo:

<system.codedom>
  <compilers>
    <compiler language="c#;cs;csharp" extension=".cs"
      type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0,
      Culture=neutral, PublicKeyToken=b77a5c561934e089"
      compilerOptions="/d:Test"/>
  </compilers>
</system.codedom>

E nel vostro uso codice

#if !Test
    SendMail();
#endif

Altri suggerimenti

Questo suona come qualcosa che si dovrebbe fare con un CIO. Io di solito uso StructureMap che mi permettesse di impostazione diversi profili. Poi tutto quello che ho dovuto fare è avere un interruttore web.config configurato per impostare il profilo ambiente appropriato.

Per esempio, in StructureMap si poteva effettuare le seguenti operazioni:

ObjectFactory.Initialize( x => {
    x.CreateProfile( "Development", p =>
    {
        p.Type<IEmailProvider>().Is.OfConcreteType<DeveloperEmailProvider>();
    } );

    x.CreateProfile( "QA", p =>
    {
        p.Type<IEmailProvider>().Is.OfConcreteType<NullEmailProvider>();
    } );

    x.CreateProfile( "Production", p =>
    {
        p.Type<IEmailProvider>().Is.OfConcreteType<ProductionEmailProvider>();
    } );

} );

ObjectFactory.Profile = ConfigurationSettings.AppSettings["Profile"];

Per i progetti leggeri, mi basta usare un valore appSetting, e quindi per tutti i messaggi di posta elettronica, passare l'indirizzo del destinatario attraverso il seguente messaggio:

public static MailAddress MailTo(string email)
{
    if (Boolean.Parse(ConfigurationManager.AppSettings["RedirectEmails"]))
    {
        return new MailAddress(ConfigurationManager.AppSettings["DebugMailbox"]);
    }

    return new MailAddress(email);
}

I nostri progetti più grandi utilizzano NAnt costruire script, quali file di configurazione utilizzare template per generare una configurazione diversa per i diversi target di compilazione (in modo da avere un file Web.Config.template, che viene fusa o con un local.properties, test.properties o release.properties file XML contenente le variabili rilevanti).

Vorrei configurare il web.config in modo diverso per gli ambienti di come System.Net.Mail invia i messaggi di posta elettronica. Date un'occhiata a Scott Gu post del blog su di esso . Per sviluppo , avrei dovuto cadere le e-mail sul server da qualche parte. Per QA , l'hanno non inviare nulla da nessuna parte, e per Produzione l'ha configurato per utilizzare il server SMTP normale.

Penso che la risposta IoC è una buona soluzione generale. Per il caso specifico di e-mail inviato direttamente a un server SMTP, è possibile invece utilizzare la soluzione di configurazione qui: Come posso salvare una e-mail invece di inviare quando si utilizza SmtpClient? . La soluzione di configurazione è semplice e poco costoso, soprattutto se il team di sviluppo non è grande il CIO.

Ho visto i progetti però dove c'è un servizio intermedio su un'altra macchina che fa il trattamento e-mail. In questo caso la soluzione di configurazione non funziona.

Ho fatto questo su un recente progetto. La mia soluzione è abbastanza coinvolta, ma in poche parole ci sono due chiavi di Web.config che controllano questo: EmailTestMode e EmailEnabled. Se EmailTestMode è attiva, i messaggi vengono generati, ma inviati a un indirizzo specifico piuttosto che il loro destinatario. Se EmailEnabled è spento, i messaggi vengono registrati ma non inviati.

Sono andato alla briga di costruire una classe Messenger che gestisce questi elementi per me - mi basta chiamare un metodo con i vari attributi del messaggio, e si capisce se e dove inviarlo. Ho anche un blocco di configurazione separata nel Web.config che contiene tutti i messaggi di sistema. In questo modo, il mittente, destinatario, oggetto e corpo può essere facilmente modificato da un file di configurazione. Nella maggior parte dei casi il corpo è sia generato dal app o utilizza String.Format () per inserire i valori.

Come altri hanno detto, usare Impostazioni applicazione nella vostra web.config. Il tuo codice runtime può quindi utilizzare la versione corretta delle impostazioni.

Un altro modo fresco di fare questo è quello di utilizzare Attributi condizionali per costruire e chiamare versioni di debug dei vostri metodi.

Io uso il mio software di controllo di versione di fare questo per me. Fondamentalmente ho più file web.config per ciascuno dei miei ambienti (dev, prova, qa, prod). Ora, nel software di controllo di versione a inserire i codici di tutti i file per l'ambiente corretto. Così, quando ho bisogno di costruire l'evnvironment qa ricevo tutti i file etichettati "QA" e così via.

Il modo in cui lo facciamo è quella di avere due chiavi di configurazione nel nostro machine.config

ProductionServers =
"PROD_SERVER" TestServers = "LOCAL_MACHINE | TEST_SERVER"

Poi abbiamo una funzione che verifica il nome della macchina (System.Environment.MachineName) vs quei valori. In questo modo non abbiamo mai di modificare qualsiasi file di configurazione sui server e quando si vuole puntare a prod invece di test abbiamo basta cambiare il nostro machine.config locale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top