ASP.NET MVC - Comment faire de code se comportent différemment lors de l'exécution locale par rapport à l'AQ par rapport à la production

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

Question

Question: Comment faire autrement se comportent le code lors de l'exécution locale par rapport à l'AQ par rapport à la production?

Exemple: Dans une application ASP.NET MVC J'ai un contrôleur mis en place pour fournir des notifications par courrier électronique. Lors de l'exécution localement sur une machine de développement, je veux que les e-mails livrés à son développeur, quand QA Je ne veux pas de notifications par courrier électronique sortant et < strong> production Je veux que les notifications vont à leurs destinataires

Merci

Était-ce utile?

La solution

Avoir trois web.configs différents et ajouter un AppSetting qui vous indique où vous êtes, vous pouvez donc déterminer si vous devez envoyer un e-mail.

Vous pouvez également définir des constantes dans votre web.config en utilisant les attributs CompilerOptions:

<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>

Et dans l'utilisation de code

#if !Test
    SendMail();
#endif

Autres conseils

Cela ressemble à quelque chose que vous devez faire en utilisant un IoC. En général, je l'utilise StructureMap qui me permettra de configurer des profils différents. Ensuite, tout ce que je dois faire est d'avoir un commutateur web.config configuré pour définir le profil de l'environnement approprié.

Par exemple, dans StructureMap vous pourriez faire ce qui suit:

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"];

Pour les projets légers, j'utilise juste une valeur AppSetting, puis pour tous les e-mails, passer l'adresse du destinataire par le message suivant:

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

    return new MailAddress(email);
}

Nos grands projets utilisent NAnt créer des scripts, qui fichiers de configuration de modèle utiliser pour générer une configuration différente pour les différentes cibles de construction (de sorte que vous avez un fichier Web.Config.template, qui est fusionné avec soit un local.properties, test.properties ou release.properties fichier XML contenant les variables pertinentes).

Je configurer le web.config différemment pour les environnements de la façon dont System.Net.Mail envoie les e-mails. Jetez un oeil à Scott Gu poste blog à ce sujet . Développement , je l'ai quelque part laisser tomber les e-mails sur le serveur. QA , l'ont pas envoyer quoi que ce soit partout, et Production l'ont configuré pour utiliser le serveur SMTP normal.

Je pense que la réponse est IoC une bonne solution générale. Pour le cas particulier des e-mails envoyé directement à un serveur SMTP, vous pouvez utiliser à la place la solution de configuration ici: Comment puis-je enregistrer un e-mail au lieu d'envoyer lors de l'utilisation smtpClient? . La solution de configuration est rapide et pas cher, surtout si l'équipe de développement n'est pas grand sur IoC.

J'ai vu des projets bien où il y a un service intermédiaire sur une autre machine qui fait le traitement de courrier électronique. Dans ce cas, la solution de configuration ne fonctionne pas.

Je l'ai fait sur un projet récent. Ma solution est assez complexe, en un mot il y a deux clés Web.config qui contrôlent ce: EmailTestMode et EmailEnabled. Si EmailTestMode est activé, les messages sont générés mais envoyés à une adresse spécifique plutôt que leur destinataire. Si EmailEnabled est désactivé, les messages sont enregistrés, mais pas envoyés.

Je suis allé à la peine de construire une classe Messenger qui gère ces articles pour moi - je viens d'appeler une méthode avec les différents attributs du message, et les chiffres savoir si et où l'envoyer. J'ai aussi un bloc de configuration séparée Web.config qui contient tous les messages du système. De cette façon, l'expéditeur, le destinataire, le sujet et le corps peut être facilement modifié à partir d'un fichier de configuration. Dans la plupart des cas, le corps est soit généré par l'application ou utilise String.Format () pour remplir des valeurs.

Comme d'autres l'ont dit, utiliser différentes Paramètres de l'application dans votre web.config. Votre code d'exécution peut alors utiliser la version correcte de vos paramètres.

Une autre façon cool de le faire est d'utiliser Attributs conditionnels pour construire et appeler les versions de débogage de vos méthodes.

J'utilise mon logiciel de contrôle de version pour le faire pour moi. Fondamentalement, j'ai plusieurs fichiers web.config pour chacun de mes environnements (dev, test, qa, prod). Maintenant, dans le logiciel de contrôle de version tagger tous les fichiers pour l'environnement correct. Alors, quand je dois construire le evnvironment qa je reçois tous les fichiers marqués « QA » et ainsi de suite.

La façon dont nous le faisons est d'avoir deux clés de configuration dans notre machine.config

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

Ensuite, nous avons une fonction qui teste le nom de la machine (System.Environment.MachineName) par rapport à ces valeurs. De cette façon, nous ne devons jamais changer les configs sur les serveurs et quand nous voulons pointer prod au lieu de test, nous suffit de changer notre machine.config local.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top